投稿:mdxy-dxy 字體:[增加 減小] 類型:轉載 時間:2017-06-25 我要評論
這篇文章主要介紹了SQL SERVER 中構建執行動態SQL語句的方法,需要的朋友可以參考下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 output select @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 output as begin 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 output end
這樣大家基本上就有些了解了。