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ò)誤,但
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)
有些特殊原因,我們需要在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
這樣大家基本上就有些了解了。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com