動態SQL使用小結

1.什麼是動態SQL?

靜態 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優化

2.重點.

執行動態SQL有兩種方法

1.使用exec命令,語法:exec 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

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

相關文章
相關標籤/搜索