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
declare @test1 sysname set @test1='Field2' select @test1 from dbo.T1
錯誤,原因:SQL在運行時,已經是應用程序運行以后了,所以@test1沒有被編譯為表的列名,這種情形必須用動態SQL才能達到效果。
declare @test2 sysname set @test2='Field2' exec ('select '+ @test2+' from T1') 注意:執行動態sql,必須有這個括號。
declare @test3 nvarchar(128) set @test3='Field2' exec ('select '+ @test3+' from T1')
正確,原因是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;
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;
注意:執行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

![XJMHXW_Y9XF5[PM1N]IL)UH XJMHXW_Y9XF5[PM1N]IL)UH](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNjU0ODgvMjAxMzEwLzI2MDQyMzQzLWNlNWU5MGNlZTI2NzRkMWU4ZDZiZGFjNmZiMGM1N2UyLmpwZw==.png)

![AUF[Y]Y@VH%KCLO@2B`97LN AUF[Y]Y@VH%KCLO@2B`97LN](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNjU0ODgvMjAxMzEwLzI2MDQyMzQ2LTJlMTFlNTA1N2JhMDQyYThhZGY2ZjVhZDBlZWMxYmI4LmpwZw==.png)
