掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在介紹動(dòng)態(tài)SQL前我們先看看什么是靜態(tài)SQL

靜態(tài) SQL 語(yǔ)句一般用于嵌入式 SQL 應(yīng)用中,在程序運(yùn)行前,SQL 語(yǔ)句必須是確定的,例如 SQL 語(yǔ)句中涉及的列名和表名必須是存在的。靜態(tài) SQL 語(yǔ)句的編譯是在應(yīng)用程序運(yùn)行前進(jìn)行的,編譯的結(jié)果會(huì)存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi)部。而后程序運(yùn)行時(shí),數(shù)據(jù)庫(kù)將直接執(zhí)行編譯好的 SQL 語(yǔ)句,降低運(yùn)行時(shí)的開(kāi)銷。
動(dòng)態(tài) SQL 語(yǔ)句是在應(yīng)用程序運(yùn)行時(shí)被編譯和執(zhí)行的,例如,使用 DB2 的交互式工具 CLP 訪問(wèn)數(shù)據(jù)庫(kù)時(shí),用戶輸入的 SQL 語(yǔ)句是不確定的,因此 SQL 語(yǔ)句只能被動(dòng)態(tài)地編譯。動(dòng)態(tài) SQL 的應(yīng)用較多,常見(jiàn)的 CLI 和 JDBC 應(yīng)用程序都使用動(dòng)態(tài) SQL。
使用EXEC(EXECUTE的縮寫(xiě))命令和使用SP_EXECUTERSQL。
EXEC命令執(zhí)行
語(yǔ)法
注:EXECUTE 命令有兩個(gè)用途,一個(gè)是用來(lái)執(zhí)行存儲(chǔ)過(guò)程,另一個(gè)是執(zhí)行動(dòng)態(tài)SQL
不帶參數(shù)示例
在變量@SQL中保存了一個(gè)字符串,該字符串中包含一條查詢語(yǔ)句,再用EXEC調(diào)用保存在變量中的批處理代碼,我們可以這樣寫(xiě)SQL:
- EXEC ('SELECT * FROM Customers')
結(jié)果如下:
與我們直接執(zhí)行SELECT * FROM Customers一樣。
帶參數(shù)示例
還是上面的示例,我們換一種寫(xiě)法
- DECLARE @SQL AS VARCHAR(100);
- DECLARE @Column AS VARCHAR(20);
- SET @Column = '姓名'
- SET @SQL = 'SELECT ' + @Column + ' FROM Customers';
- EXEC (@SQL)
結(jié)果如下:
SP_EXECUTERSQL執(zhí)行
語(yǔ)法
EXEC SP_EXECUTERSQL 參數(shù)1,參數(shù)2,參數(shù)3
注意:SP_EXECUTERSQL是繼EXEC后另一種執(zhí)行動(dòng)態(tài)SQL的方法。使用這個(gè)存儲(chǔ)過(guò)程更加安全和靈活,因?yàn)樗С州斎牒洼敵鰠?shù)。注意的是,與EXEC不同的是,SP_EXECUTERSQL只支持使用Unicode字符串作為其輸入的批處理代碼。
示例
構(gòu)造了一個(gè)對(duì)Customers表進(jìn)行查詢的批處理代碼,在其查詢過(guò)濾條件中使用一個(gè)輸入?yún)?shù)@CusID
- DECLARE @SQL AS NVARCHAR(100);
- SET @SQL=N'SELECT * FROM Customers
- WHERE 客戶ID=@CusID;';
- EXEC SP_EXECUTESQL
- @STMT=@SQL,
- @PARMS=N'@CusID AS INT',
- @CusID=1;
結(jié)果如下:
代碼中將輸入?yún)?shù)取值指定為1,但即使采用不同的值在運(yùn)行這段代碼,代碼字符串仍然保存相同。這樣就可以增加重用以前緩存過(guò)的執(zhí)行計(jì)劃的機(jī)會(huì)。
動(dòng)態(tài)SQL在日常工作中可能接觸的比較少,但是其功能是非常強(qiáng)大的,可以直接嵌套在代碼里進(jìn)行操作數(shù)據(jù),但是也很容易出錯(cuò),特別是在進(jìn)行命令拼接時(shí)候要非常仔細(xì)。這里只是給大家簡(jiǎn)單介紹一下其使用方法,需要深入使用還需要多多研究。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流