<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        SQLSERVER中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語句的方法

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 06:59:51
        文檔

        SQLSERVER中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語句的方法

        SQLSERVER中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語句的方法:1 :普通SQL語句可以用exec執(zhí)行 Select * from tableName exec('select * from tableName') exec sp_executesql N'select * from tableName' -- 請(qǐng)注意字符串前一定要加N 2:字段名,表名,數(shù)據(jù)庫名之類作為變量時(shí),必須用動(dòng)態(tài)SQL d
        推薦度:
        導(dǎo)讀SQLSERVER中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語句的方法:1 :普通SQL語句可以用exec執(zhí)行 Select * from tableName exec('select * from tableName') exec sp_executesql N'select * from tableName' -- 請(qǐng)注意字符串前一定要加N 2:字段名,表名,數(shù)據(jù)庫名之類作為變量時(shí),必須用動(dòng)態(tài)SQL d

        1 :普通SQL語句可以用exec執(zhí)行

        Select * from tableName 
        exec('select * from tableName') 
        exec sp_executesql N'select * from tableName' -- 請(qǐng)注意字符串前一定要加N 

        2:字段名,表名,數(shù)據(jù)庫名之類作為變量時(shí),必須用動(dòng)態(tài)SQL

        declare @fname varchar(20) 
        set @fname = 'FiledName' 
        --Select @fname from tableName -- 錯(cuò)誤,不會(huì)提示錯(cuò)誤,但
        結(jié)果為固定值FiledName,并非所要。 exec('select ' + @fname + ' from tableName') -- 請(qǐng)注意 加號(hào)前后的 單引號(hào)的邊上加空格 --當(dāng)然將字符串改成變量的形式也可 declare @fname varchar(20) set @fname = 'FiledName' --設(shè)置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 成功 --exec sp_executesql @s -- 此句會(huì)報(bào)錯(cuò) declare @s Nvarchar(1000) -- 注意此處改為nvarchar(1000) (必須為ntext或nchar哐nvarchar類型,不能是varchar類型) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 成功 exec sp_executesql @s -- 此句正確

        3. 輸入或輸出參數(shù)

        --(1)輸入?yún)?shù):
         declare @QueryString nvarchar(1000) --動(dòng)態(tài)查詢語句變量(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型)
         declare @paramstring nvarchar(200) --設(shè)置動(dòng)態(tài)語句中的參數(shù)的字符串(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型)
         declare @input_id int--定義需傳入動(dòng)態(tài)語句的參數(shù)的值
        
         set @QueryString='select * from tablename where id=@id' --id為字段名,@id為要傳入的參數(shù)
         set @paramstring='@id int' --設(shè)置動(dòng)態(tài)語句中參數(shù)的定義的字符串
         set @input_id =1 --設(shè)置需傳入動(dòng)態(tài)語句的參數(shù)的值為1
         exec sp_executesql @querystring,@paramstring,@id=@input_id  
         --若有多個(gè)參數(shù):
         declare @QueryString nvarchar(1000) --動(dòng)態(tài)查詢語句變量(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型)
         declare @paramstring nvarchar(200) --設(shè)置動(dòng)態(tài)語句中的參數(shù)的字符串(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型)
         declare @input_id int--定義需傳入動(dòng)態(tài)語句的參數(shù)的值,參數(shù)1
         declare @input_name varchar(20)--定義需傳入動(dòng)態(tài)語句的參數(shù)的值,參數(shù)2
        
         set @QueryString='select * from tablename where id=@id and name=@name' --id與name為字段名,@id與@name為要傳入的參數(shù)
         set @paramstring='@id int,@name varchar(20)' --設(shè)置動(dòng)態(tài)語句中參數(shù)的定義的字符串,多個(gè)參數(shù)用","隔開
         set @input_id =1 --設(shè)置需傳入動(dòng)態(tài)語句的參數(shù)的值為1
         set @input_name='張三' --設(shè)置需傳入動(dòng)態(tài)語句的參數(shù)的值為"張三"
         exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name --請(qǐng)注意參數(shù)的順序
         --(2)
        輸出參數(shù) declare @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' exec(@sqls) --如何將exec執(zhí)行結(jié)果放入變量中? declare @QueryString nvarchar(1000) --動(dòng)態(tài)查詢語名變量(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型) declare @paramstring nvarchar(200) --設(shè)置動(dòng)態(tài)語句中的參數(shù)的字符串(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型) declare @output_result int--查詢結(jié)果賦給@output_result set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 為輸出結(jié)果參數(shù) set @paramstring='@totalcount int output' --設(shè)置動(dòng)態(tài)語句中參數(shù)的定義的字符串,多個(gè)參數(shù)用","隔開 exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output select @output_result --當(dāng)然,輸入與輸出參數(shù)可以一起使用,大家可以自己去試一試。 --另外,動(dòng)態(tài)語句查詢的結(jié)果集要輸出的話,我只想到以下用臨時(shí)表的方法,不知各位有沒有更好的方法. IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判斷臨時(shí)表#tmp是否存在,存在則刪除 drop table #tmp select * into #tmp from tablename where 1=2 --創(chuàng)建臨時(shí)表#tmp,其結(jié)構(gòu)與tablename相同 declare @QueryString nvarchar(1000) --動(dòng)態(tài)查詢語名變量(注:必須為ntext或nchar哐nvarchar類型,不能是varchar類型) set @QueryString='select * from tablename ' insert into #tmp(field1,field2,) exec(@querystirng)

        有些特殊原因,我們需要在SQL語句或者存儲(chǔ)過程中動(dòng)態(tài)創(chuàng)建SQL語句,然后在SQL語句或存儲(chǔ)過程中動(dòng)態(tài)來執(zhí)行。

        這里,微軟提供了兩個(gè)方法,一個(gè)是使用

        Execute函數(shù)

        執(zhí)行方式為

        Execute(@sql)來動(dòng)態(tài)執(zhí)行一個(gè)SQL語句,但是這里的SQL語句無法得到里面的返回結(jié)果,下面來介紹另一種方法

        使用存儲(chǔ)過程 sp_ExecuteSql

        使用該存儲(chǔ)過程,則可將動(dòng)態(tài)語句中的參數(shù)返回來。

        比如

        declare @sql nvarchar(800),@dd varchar(20)
        set @sql='set @mm=''測(cè)試字符串'''
        exec sp_executesql @sql,N'@mm varchar(20) output',@dd output
        select @dd 

        執(zhí)行他就會(huì)將內(nèi)部創(chuàng)建的SQL語句的某個(gè)變量的值返回到外部調(diào)用者。

        主要來源于工作中的一個(gè)偶然需要:

        create proc proc_InToServer @收費(fèi)站點(diǎn)編號(hào) varchar(4),@車道號(hào) tinyint,@進(jìn)入時(shí)間 varchar(23),@UID char(16),
        @車牌 varchar(12),@車型 char(1),@識(shí)別車牌號(hào) varchar(12),@識(shí)別車型 char(1),@收費(fèi)金額 money,@交易狀態(tài) char(1),
        @有圖像 bit,@離開時(shí)間 varchar(23),@速度 float,@HasInsert int output
        as
        begin
         declare @inTime datetime,@TableName varchar(255),@leaveTime datetime,@HasTable bit,@Sql nvarchar(4000)
         select @intime=Convert(datetime,@進(jìn)入時(shí)間),@leaveTime=Convert(datetime,@離開時(shí)間)
         set @TableName='ETC03_01_OBE原始過車記錄表_'+dbo.formatDatetime(@intime,'YYYYMMDD')
        
         select @HasTable=(Case when Count(*)>0 then 1 else 0 end) from sysobjects where id=Object_id(@TableName) and ObjectProperty(id,'IsUserTable')=1
         if @HasTable=0
         begin
         set @Sql='CREATE TABLE [dbo].['+@TableName+'] (
         [收費(fèi)站點(diǎn)編號(hào)] [char] (4) COLLATE Chinese_PRC_CI_AS NOT NULL,
         [車道號(hào)] [tinyint] NOT NULL,
         [進(jìn)入時(shí)間] [datetime] NOT NULL,
         [UID] [char] (16) COLLATE Chinese_PRC_CI_AS NOT NULL,
         [車牌] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
         [車型] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
         [識(shí)別車牌號(hào)] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
         [識(shí)別車型] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
         [收費(fèi)金額] [money] NULL ,
         [交易狀態(tài)] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
         [有圖像] [bit] NOT NULL ,
         [離開時(shí)間] [datetime] NULL ,
         [速度] [float] NULL,
         Constraint'+' PK_'+@TableName+' primary key(收費(fèi)站點(diǎn)編號(hào),車道號(hào),進(jìn)入時(shí)間,UID)
         ) ON [PRIMARY]'
         Execute(@Sql)
         end 
         set @sql = 'select @Cnt=count(*) from '+@TableName+ ' where 收費(fèi)站點(diǎn)編號(hào)='''+@收費(fèi)站點(diǎn)編號(hào)+''' and 車道號(hào)='+cast(@車道號(hào) as varchar(4))+' and 進(jìn)入時(shí)間='''+@進(jìn)入時(shí)間+''' and UID='''+@UID+''''
         set @sql = @sql + ' if @Cnt=0 '
         
         set @sql=@sql+'insert '+@TableName+' values('''+@收費(fèi)站點(diǎn)編號(hào)+''','+cast(@車道號(hào) as varchar(4))+','''+@進(jìn)入時(shí)間+''','''+@Uid+''','''+@車牌+ 
         ''','''+@車型+''','''+ @識(shí)別車牌號(hào)+''','''+@識(shí)別車型+''','+Cast(@收費(fèi)金額 as varchar(8))+','''+@交易狀態(tài)+''','+cast(@有圖像 as varchar(1))+
         ','''+@離開時(shí)間+''','+Cast(@速度 as varchar(8))+')'
         --Execute(@sql) 
         exec sp_executesql @sql,N'@Cnt int output',@HasInsert output
        end

        這樣大家基本上就有些了解了。

        您可能感興趣的文章:

      1. PHP實(shí)現(xiàn)mysqli批量執(zhí)行多條語句的方法示例
      2. 用非動(dòng)態(tài)SQL Server SQL語句來對(duì)動(dòng)態(tài)查詢進(jìn)行執(zhí)行
      3. mybatis 插件: 打印 sql 及其執(zhí)行時(shí)間實(shí)現(xiàn)方法
      4. Mysql使用kill命令解決死鎖問題(殺死某條正在執(zhí)行的sql語句)
      5. Mysql 服務(wù) 1067 錯(cuò)誤 的解決方法:修改mysql可執(zhí)行文件路徑
      6. MySql批量插入優(yōu)化Sql執(zhí)行效率實(shí)例詳解
      7. oracle查看執(zhí)行最慢與查詢次數(shù)最多的sql語句
      8. SQL執(zhí)行步驟的具體分析
      9. 聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        SQLSERVER中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語句的方法

        SQLSERVER中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語句的方法:1 :普通SQL語句可以用exec執(zhí)行 Select * from tableName exec('select * from tableName') exec sp_executesql N'select * from tableName' -- 請(qǐng)注意字符串前一定要加N 2:字段名,表名,數(shù)據(jù)庫名之類作為變量時(shí),必須用動(dòng)態(tài)SQL d
        推薦度:
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲女人18毛片水真多| 亚洲视频一区二区三区| 日韩成人免费aa在线看| 热99re久久免费视精品频软件| 国产大片91精品免费观看男同 | 免费人成大片在线观看播放| 午夜在线免费视频| 成人免费激情视频| 亚洲?V无码成人精品区日韩| 亚洲国产日韩一区高清在线| 亚洲最大中文字幕无码网站| EEUSS影院WWW在线观看免费| 97免费人妻无码视频| 在线亚洲午夜片AV大片| 一级做受视频免费是看美女| 免费国产黄线在线观看| 亚洲天堂中文字幕在线| 亚洲一区二区三区写真| 国产特级淫片免费看| 一级毛片免费不卡直观看| 国产亚洲免费的视频看| 亚洲欧洲无码一区二区三区| 永久在线免费观看| 夜夜春亚洲嫩草影院| 国产成人精品日本亚洲语音| 最近2019年免费中文字幕高清| 日韩高清免费在线观看| 一区二区视频在线免费观看| 亚洲av无码成h人动漫无遮挡 | 亚洲国产精品成人精品软件| 毛片免费观看的视频| 亚洲精品白色在线发布| av永久免费网站在线观看| 国产精品公开免费视频| 99久久99这里只有免费的精品| 亚洲成AⅤ人影院在线观看| 精品亚洲视频在线| 国产成人亚洲综合色影视| 美女无遮挡拍拍拍免费视频| 亚洲情侣偷拍精品| 国产vA免费精品高清在线观看|