動態SQL使用小結


1.什么是動態SQL?

靜態 SQL:靜態 SQL 語句一般用於嵌入式 SQL 應用中,在程序運行前,SQL 語句必須是確定的,例如 SQL 語句中涉及的列名和表名必須是存在的。靜態 SQL 語句的編譯是在應用程序運行前進行的,編譯的結果會存儲在數據庫內部。而后程序運行時,數據庫將直接執行編譯好的 SQL 語句,降低運行時的開銷。

動態 SQL:動態 SQL 語句是在應用程序運行時被編譯和執行的,例如,使用 DB2 的交互式工具 CLP 訪問數據庫時,用戶輸入的 SQL 語句是不確定的,因此 SQL 語句只能被動態地編譯。動態 SQL 的應用較多,常見的 CLI 和 JDBC 應用程序都使用動態 SQL。

http://www.360doc.com/content/09/1028/16/8411_7986235.shtml

動態SQL的應用場景:

1:普通SQL語句可以用Exec執行,但沒有意義,反倒性能低下。

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

2.重點.

執行動態SQL有兩種方法

1.使用exec命令,語法:exec sql

exec命令有兩個用途,一個是用來執行存儲過程,另一個是執行動態SQL

用法1:無參數的exec動態SQL   

exec ('select field2 from t1')

點評:這樣做其實沒有意義,性能低,動態SQL最好用在數據庫名,表名,字段名作為參數的時候的場景。那時必須用動態SQL才能執行。

用法2:有參數的動態SQL

declare @test nvarchar
set @test='Field2'
select @test from dbo.T1

XJMHXW_Y9XF5[PM1N]IL)UH錯誤,出現結果的原因:估計是類型的原因

declare @test1 sysname
set @test1='Field2'
select @test1 from dbo.T1

{H9RDFF%4(O{D%CUX6NDZR2錯誤,原因:SQL在運行時,已經是應用程序運行以后了,所以@test1沒有被編譯為表的列名,這種情形必須用動態SQL才能達到效果。

declare @test2 sysname
set @test2='Field2'
exec ('select '+ @test2+' from T1') 注意:執行動態sql,必須有這個括號。

HF(R[16`0F8@I7CI6Q59`KC正確

declare @test3 nvarchar(128)
set @test3='Field2'
exec ('select '+ @test3+' from T1')

}0%QYRDI)$6}2Z0{@D[_%TH正確,原因是nvarchar(128) 和sysname等效

參見:http://www.cnblogs.com/chenxizhang/archive/2009/04/15/1436764.html

2.使用系統存儲過程

語法:exec excutesql  參數1,參數2,參數3

其中參數1是要執行的動態SQL語句,參數2是輸入的參數的定義,參數3是輸入的參數的值

2.1Demo:

DECLARE @IntVariable INT,@SQLString NVARCHAR(500),@ParmDefinition NVARCHAR(500);
SET @SQLString =N'SELECT * FROM T1 WHERE Field2 = @Field';--給需要執行的sql賦值
SET @ParmDefinition = N'@Field int';--以字符串的形式給第二個參數賦值
ET @IntVariable = 1;--給需要傳入的參數賦值
EXECUTE sp_executesql @SQLString, @ParmDefinition,@Field = @IntVariable;

AUF[Y]Y@VH%KCLO@2B`97LN

DECLARE @IntVariable INT,@SQLString VARCHAR(500),@ParmDefinition VARCHAR(500);
SET @SQLString ='SELECT * FROM T1 WHERE Field2 = @Field';--給需要執行的sql賦值
SET @ParmDefinition = '@Field int';--給需要傳入的參數進行定義
SET @IntVariable = 1;--給需要傳入的參數賦值
EXECUTE sp_executesql @SQLString, @ParmDefinition,@Field = @IntVariable;

QQ截圖20131028032715

注意:執行sp_executesql ,它的3個參數必須是可以隱式轉換為nvarchar類型的參數,否則報錯。如果沒有定義,可以在參數賦值的前面+N

2.2 sp_executesql 的優點:

sp_executesql 支持替換 Transact-SQL 字符串中指定的任何參數值,但 EXECUTE 語句不支持。因此,由 sp_executesql 生成的 Transact-SQL 字符串比那些由 EXECUTE 語句生成的字符串更加相似。SQL Server 查詢優化器可能將 sp_executesql 的 Transact-SQL 語句與以前所執行的語句的執行計划相匹配,從而節省編譯新的執行計划的開銷。

 

參考資料:

http://msdn.microsoft.com/zh-cn/library/ms175170.aspx

http://blog.csdn.net/Tercel99/article/details/2901550

http://www.jcwcn.com/article-28686-1.html

http://www.51testing.com/html/46/n-223846.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM