SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
1 :普通SQL語(yǔ)句可以用exec執(zhí)行
Select * from tableName
exec('select * from tableName')
exec sp_executesql N'select * from tableName' -- 請(qǐng)注意字符串前一定要加N
2:字段名,表名,數(shù)據(jù)庫(kù)名之類(lèi)作為變量時(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類(lèi)型,不能是varchar類(lèi)型)
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)查詢(xún)語(yǔ)句變量(注:必須為ntext或nchar哐nvarchar類(lèi)型,不能是varchar類(lèi)型)
declare @paramstring nvarchar(200) --設(shè)置動(dòng)態(tài)語(yǔ)句中的參數(shù)的字符串(注:必須為ntext或nchar哐nvarchar類(lèi)型,不能是varchar類(lèi)型)
declare @input_id int--定義需傳入動(dòng)態(tài)語(yǔ)句的參數(shù)的值
set @QueryString='select * from tablename where id=@id' --id為字段名,@id為要傳入的參數(shù)
set @paramstring='@id int' --設(shè)置動(dòng)態(tài)語(yǔ)句中參數(shù)的定義的字符串
set @input_id =1 --設(shè)置需傳入動(dòng)態(tài)語(yǔ)句的參數(shù)的值為1
exec sp_executesql @querystring,@paramstring,@id=@input_id
--若有多個(gè)參數(shù):
declare @QueryString nvarchar(1000) --動(dòng)態(tài)查詢(xún)語(yǔ)句變量(注:必須為ntext或nchar哐nvarchar類(lèi)型,不能是varchar類(lèi)型)
declare @paramstring nvarchar(200) --設(shè)置動(dòng)態(tài)語(yǔ)句中的參數(shù)的字符串(注:必須為ntext或nchar哐nvarchar類(lèi)型,不能是varchar類(lèi)型)
declare @input_id int--定義需傳入動(dòng)態(tài)語(yǔ)句的參數(shù)的值,參數(shù)1
declare @input_name varchar(20)--定義需傳入動(dòng)態(tài)語(yǔ)句的參數(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)語(yǔ)句中參數(shù)的定義的字符串,多個(gè)參數(shù)用","隔開(kāi)
set @input_id =1 --設(shè)置需傳入動(dòng)態(tài)語(yǔ)句的參數(shù)的值為1
set @input_name='張三' --設(shè)置需傳入動(dòng)態(tài)語(yǔ)句的參數(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)查詢(xún)語(yǔ)名變量(注:必須為ntext或nchar哐nvarchar類(lèi)型,不能是varchar類(lèi)型)
declare @paramstring nvarchar(200) --設(shè)置動(dòng)態(tài)語(yǔ)句中的參數(shù)的字符串(注:必須為ntext或nchar哐nvarchar類(lèi)型,不能是varchar類(lèi)型)
declare @output_result int--查詢(xún)結(jié)果賦給@output_result
set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 為輸出結(jié)果參數(shù)
set @paramstring='@totalcount int output' --設(shè)置動(dòng)態(tài)語(yǔ)句中參數(shù)的定義的字符串,多個(gè)參數(shù)用","隔開(kāi)
exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output
select @output_result
--當(dāng)然,輸入與輸出參數(shù)可以一起使用,大家可以自己去試一試。
--另外,動(dòng)態(tài)語(yǔ)句查詢(xún)的結(jié)果集要輸出的話,我只想到以下用臨時(shí)表的方法,不知各位有沒(méi)有更好的方法.
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)查詢(xún)語(yǔ)名變量(注:必須為ntext或nchar哐nvarchar類(lèi)型,不能是varchar類(lèi)型)
set @QueryString='select * from tablename '
insert into #tmp(field1,field2,) exec(@querystirng)
有些特殊原因,我們需要在SQL語(yǔ)句或者存儲(chǔ)過(guò)程中動(dòng)態(tài)創(chuàng)建SQL語(yǔ)句,然后在SQL語(yǔ)句或存儲(chǔ)過(guò)程中動(dòng)態(tài)來(lái)執(zhí)行。
這里,微軟提供了兩個(gè)方法,一個(gè)是使用
Execute函數(shù)
執(zhí)行方式為
Execute(@sql)來(lái)動(dòng)態(tài)執(zhí)行一個(gè)SQL語(yǔ)句,但是這里的SQL語(yǔ)句無(wú)法得到里面的返回結(jié)果,下面來(lái)介紹另一種方法
使用存儲(chǔ)過(guò)程 sp_ExecuteSql
使用該存儲(chǔ)過(guò)程,則可將動(dòng)態(tài)語(yǔ)句中的參數(shù)返回來(lái)。
比如
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語(yǔ)句的某個(gè)變量的值返回到外部調(diào)用者。
主要來(lái)源于工作中的一個(gè)偶然需要:
create proc proc_InToServer @收費(fèi)站點(diǎn)編號(hào) varchar(4),@車(chē)道號(hào) tinyint,@進(jìn)入時(shí)間 varchar(23),@UID char(16),
@車(chē)牌 varchar(12),@車(chē)型 char(1),@識(shí)別車(chē)牌號(hào) varchar(12),@識(shí)別車(chē)型 char(1),@收費(fèi)金額 money,@交易狀態(tài) char(1),
@有圖像 bit,@離開(kāi)時(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,@離開(kāi)時(shí)間)
set @TableName='ETC03_01_OBE原始過(guò)車(chē)記錄表_'+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,
[車(chē)道號(hào)] [tinyint] NOT NULL,
[進(jìn)入時(shí)間] [datetime] NOT NULL,
[UID] [char] (16) COLLATE Chinese_PRC_CI_AS NOT NULL,
[車(chē)牌] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
[車(chē)型] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
[識(shí)別車(chē)牌號(hào)] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
[識(shí)別車(chē)型] [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 ,
[離開(kāi)時(shí)間] [datetime] NULL ,
[速度] [float] NULL,
Constraint'+' PK_'+@TableName+' primary key(收費(fèi)站點(diǎn)編號(hào),車(chē)道號(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 車(chē)道號(hào)='+cast(@車(chē)道號(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(@車(chē)道號(hào) as varchar(4))+','''+@進(jìn)入時(shí)間+''','''+@Uid+''','''+@車(chē)牌+
''','''+@車(chē)型+''','''+ @識(shí)別車(chē)牌號(hào)+''','''+@識(shí)別車(chē)型+''','+Cast(@收費(fèi)金額 as varchar(8))+','''+@交易狀態(tài)+''','+cast(@有圖像 as varchar(1))+
','''+@離開(kāi)時(shí)間+''','+Cast(@速度 as varchar(8))+')'
--Execute(@sql)
exec sp_executesql @sql,N'@Cnt int output',@HasInsert output
end
這樣大家基本上就有些了解了。
欄 目:MsSql
下一篇:深入淺析SQL中的group by 和 having 用法
本文標(biāo)題:SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
本文地址:http://www.jygsgssxh.com/a1/MsSql/10453.html
您可能感興趣的文章
- 01-10SQLServer存儲(chǔ)過(guò)程實(shí)現(xiàn)單條件分頁(yè)
- 01-10SQL Server 2012降級(jí)至2008R2的方法
- 01-10SQLServer中防止并發(fā)插入重復(fù)數(shù)據(jù)的方法詳解
- 01-10SQL Server數(shù)據(jù)庫(kù)定時(shí)自動(dòng)備份
- 01-10SQL Server性能調(diào)優(yōu)之緩存
- 01-10實(shí)現(xiàn)SQL Server 原生數(shù)據(jù)從XML生成JSON數(shù)據(jù)的實(shí)例代碼
- 01-10Sql Server 死鎖的監(jiān)控分析解決思路
- 01-10SqlServer 在事務(wù)中獲得自增ID的實(shí)例代碼
- 01-10SqlServer快速檢索某個(gè)字段在哪些存儲(chǔ)過(guò)程中(sql 語(yǔ)句)
- 01-10SQLServer性能優(yōu)化--間接實(shí)現(xiàn)函數(shù)索引或者Hash索引


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10SQLServer存儲(chǔ)過(guò)程實(shí)現(xiàn)單條件分頁(yè)
- 01-10SQLServer中防止并發(fā)插入重復(fù)數(shù)據(jù)的方
- 01-10SQL Server 2012降級(jí)至2008R2的方法
- 01-10SQL Server性能調(diào)優(yōu)之緩存
- 01-10SQL Server數(shù)據(jù)庫(kù)定時(shí)自動(dòng)備份
- 01-10Sql Server 死鎖的監(jiān)控分析解決思路
- 01-10實(shí)現(xiàn)SQL Server 原生數(shù)據(jù)從XML生成JSON數(shù)
- 01-10SqlServer快速檢索某個(gè)字段在哪些存儲(chǔ)
- 01-10SqlServer 在事務(wù)中獲得自增ID的實(shí)例代
- 01-10SQLServer性能優(yōu)化--間接實(shí)現(xiàn)函數(shù)索引或
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery


