亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL SERVER 中構建執行動態SQL語句的方法

2024-08-31 01:04:57
字體:
來源:轉載
供稿:網友

1 :普通SQL語句可以用exec執行

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

2:字段名,表名,數據庫名之類作為變量時,必須用動態SQL

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

3. 輸入或輸出參數

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

有些特殊原因,我們需要在SQL語句或者存儲過程中動態創建SQL語句,然后在SQL語句或存儲過程中動態來執行。

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

Execute函數

執行方式為

Execute(@sql)來動態執行一個SQL語句,但是這里的SQL語句無法得到里面的返回結果,下面來介紹另一種方法

使用存儲過程 sp_ExecuteSql

使用該存儲過程,則可將動態語句中的參數返回來。

比如

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

執行他就會將內部創建的SQL語句的某個變量的值返回到外部調用者。

主要來源于工作中的一個偶然需要:

create proc proc_InToServer @收費站點編號 varchar(4),@車道號 tinyint,@進入時間 varchar(23),@UID char(16),@車牌 varchar(12),@車型 char(1),@識別車牌號 varchar(12),@識別車型 char(1),@收費金額 money,@交易狀態 char(1),@有圖像 bit,@離開時間 varchar(23),@速度 float,@HasInsert int outputasbegin  declare @inTime datetime,@TableName varchar(255),@leaveTime datetime,@HasTable bit,@Sql nvarchar(4000) select @intime=Convert(datetime,@進入時間),@leaveTime=Convert(datetime,@離開時間) 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+'] ( [收費站點編號] [char] (4) COLLATE Chinese_PRC_CI_AS NOT NULL, [車道號] [tinyint] NOT NULL, [進入時間] [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 , [識別車牌號] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL , [識別車型] [char] (1) COLLATE Chinese_PRC_CI_AS NULL , [收費金額] [money] NULL , [交易狀態] [char] (1) COLLATE Chinese_PRC_CI_AS NULL , [有圖像] [bit] NOT NULL , [離開時間] [datetime] NULL , [速度] [float] NULL,    Constraint'+' PK_'+@TableName+' primary key(收費站點編號,車道號,進入時間,UID)    ) ON [PRIMARY]'   Execute(@Sql)  end   set @sql = 'select @Cnt=count(*) from '+@TableName+ ' where 收費站點編號='''+@收費站點編號+''' and 車道號='+cast(@車道號 as varchar(4))+' and 進入時間='''+@進入時間+''' and UID='''+@UID+''''  set @sql = @sql + ' if @Cnt=0 '    set @sql=@sql+'insert '+@TableName+' values('''+@收費站點編號+''','+cast(@車道號 as varchar(4))+','''+@進入時間+''','''+@Uid+''','''+@車牌+    ''','''+@車型+''','''+  @識別車牌號+''','''+@識別車型+''','+Cast(@收費金額 as varchar(8))+','''+@交易狀態+''','+cast(@有圖像 as varchar(1))+  ','''+@離開時間+''','+Cast(@速度 as varchar(8))+')'  --Execute(@sql)   exec sp_executesql @sql,N'@Cnt int output',@HasInsert outputend

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


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久婷婷国产麻豆91天堂| 日韩在线欧美在线国产在线| 国产一区视频在线播放| 久久成人亚洲精品| 亚洲视频精品在线| 国产日韩欧美视频在线| 日韩精品免费观看| 黄色成人在线免费| 国产一区二区三区在线观看网站| 国产国语刺激对白av不卡| 北条麻妃一区二区三区中文字幕| 久久综合久久美利坚合众国| 久久久国产在线视频| 91精品国产综合久久久久久蜜臀| 动漫精品一区二区| 国产色综合天天综合网| 欧美极品少妇全裸体| 91在线视频免费| 欧美黑人狂野猛交老妇| 亚洲a级在线观看| 国产成人精品一区二区三区| 久久天天躁夜夜躁狠狠躁2022| 亚洲激情免费观看| 在线视频欧美性高潮| 欧美风情在线观看| 浅井舞香一区二区| 亚洲精品福利在线观看| 精品国产精品自拍| 91天堂在线观看| 国自产精品手机在线观看视频| 国产丝袜一区二区三区| 国产精品色婷婷视频| 久久天天躁狠狠躁夜夜爽蜜月| 最好看的2019年中文视频| 欧美激情亚洲激情| 欧美午夜精品久久久久久浪潮| 欧美日韩国产中文字幕| 欧美一级淫片播放口| 疯狂蹂躏欧美一区二区精品| 国产盗摄xxxx视频xxx69| 久久久久久国产| 国产精品偷伦一区二区| 九九久久综合网站| 久久久久国产一区二区三区| 国产精品成人免费视频| 亚洲精品一区久久久久久| 日本精品久久久| 亚洲免费影视第一页| 国产欧美久久久久久| 中文字幕国产精品久久| 欧美在线国产精品| 日韩精品在线观看一区| 欧美黑人视频一区| 成人黄色生活片| 大伊人狠狠躁夜夜躁av一区| 日韩精品极品视频免费观看| 精品国产视频在线| 欧美国产在线电影| 日韩精品中文字幕视频在线| 国产精品久久久久久超碰| 久久精品成人一区二区三区| 精品无码久久久久久国产| 久久精品免费电影| 国产日韩欧美一二三区| 91青草视频久久| 国产亚洲免费的视频看| 亚洲一区二区三区视频播放| 亚洲福利在线视频| 亚洲娇小xxxx欧美娇小| 青青草国产精品一区二区| 亚洲欧美中文字幕| 欧美国产日韩在线| 久久久免费精品视频| 日韩精品视频在线观看网址| 亚洲精品91美女久久久久久久| 色哟哟网站入口亚洲精品| 日本欧美一二三区| 精品无人区乱码1区2区3区在线| 91午夜理伦私人影院| 久久精品国产成人| 国产一区二区黄| 成人一区二区电影| 亚洲一区www| 日韩视频一区在线| 欧美成人免费视频| 欧美性生交大片免网| 亚洲热线99精品视频| 成人黄色片网站| 亚洲欧美日韩视频一区| 欧美中文字幕在线播放| 日韩精品在线视频美女| 久久久精品影院| 国产精品自拍视频| 51色欧美片视频在线观看| 亚洲电影av在线| 在线电影中文日韩| xvideos成人免费中文版| 欧美激情视频免费观看| 久久久久久高潮国产精品视| 欧美日韩国产va另类| 亚洲在线免费看| 日韩在线欧美在线| 亚洲人成亚洲人成在线观看| 国产精品91视频| 欧美多人乱p欧美4p久久| 国产成人亚洲综合91| 国产日韩精品电影| 欧美巨乳美女视频| 一区二区亚洲欧洲国产日韩| 亚洲free性xxxx护士hd| 人体精品一二三区| 国产视频丨精品|在线观看| 国产99久久精品一区二区永久免费| 国产精品va在线| 欧美日韩国产黄| 国产精品第一视频| 黄色精品在线看| 国产精品免费久久久久影院| 亚洲免费一级电影| 日韩电影免费观看中文字幕| 国产91在线播放九色快色| 2020久久国产精品| 日韩精品视频在线播放| 日韩av中文字幕在线免费观看| 色婷婷亚洲mv天堂mv在影片| 国产精品视频一区国模私拍| 亚洲理论片在线观看| 久久久女女女女999久久| 国内精品一区二区三区| 国产成人精品在线观看| 欧美又大粗又爽又黄大片视频| 成人欧美一区二区三区黑人孕妇| 日韩精品在线电影| 亚洲白拍色综合图区| 一道本无吗dⅴd在线播放一区| 国产狼人综合免费视频| 懂色av一区二区三区| 国产精品高潮呻吟久久av无限| 亚洲午夜久久久久久久| 国产精品综合网站| 成人夜晚看av| 亚洲区中文字幕| 国产精品久久久999| 欧美日韩高清区| 97在线看免费观看视频在线观看| 国产精品久久久久久久美男| 国产精品扒开腿爽爽爽视频| 91香蕉嫩草影院入口| 97久久伊人激情网| 欧美性生交xxxxx久久久| 国产精品视频播放| 一区二区成人精品| 国产精品嫩草影院久久久| 欧美性猛交xxxx久久久| 久久精品99无色码中文字幕| 亚洲精品影视在线观看| 欧美精品福利视频| 美女撒尿一区二区三区| 亚洲国产精品免费| 成人午夜在线观看| 亚洲人成亚洲人成在线观看| 欧美成年人网站| 欧美洲成人男女午夜视频| 成人午夜激情网|