靜態 SQL:靜態 SQL 語句通常用於嵌入式 SQL 應用中,在程序運行前,SQL 語句必須是肯定的,例如 SQL 語句中涉及的列名和表名必須是存在的。靜態 SQL 語句的編譯是在應用程序運行前進行的,編譯的結果會存儲在數據庫內部。然後程序運行時,數據庫將直接執行編譯好的 SQL 語句,下降運行時的開銷。html
動態 SQL:動態 SQL 語句是在應用程序運行時被編譯和執行的,例如,使用 DB2 的交互式工具 CLP 訪問數據庫時,用戶輸入的 SQL 語句是不肯定的,所以 SQL 語句只能被動態地編譯。動態 SQL 的應用較多,常見的 CLI 和 JDBC 應用程序都使用動態 SQL。sql
http://www.360doc.com/content/09/1028/16/8411_7986235.shtml數據庫
動態SQL的應用場景:工具
1:普通SQL語句能夠用Exec執行,但沒有意義,反倒性能低下。性能
2:字段名,表名,數據庫名之類做爲變量時,必須用動態SQL優化
exec命令有兩個用途,一個是用來執行存儲過程,另外一個是執行動態SQLspa
用法1:無參數的exec動態SQL .net
exec ('select field2 from t1')
點評:這樣作其實沒有意義,性能低,動態SQL最好用在數據庫名,表名,字段名做爲參數的時候的場景。那時必須用動態SQL才能執行。3d
用法2:有參數的動態SQLcode
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
其中參數1是要執行的動態SQL語句,參數2是輸入的參數的定義,參數3是輸入的參數的值
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
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