SQL高級知識——動態SQL

SQL 數據庫 SQL數據庫開發 2019-06-11

在介紹動態SQL前我們先看看什麼是靜態SQL

靜態SQL

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

動態SQL

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

動態SQL作用

  • 自動化管理任務。例如:對於數據庫實例中的每個數據庫,查詢其元數據,為其執行BACKUP DATABASE語句。
  • 改善特定任務的性能。例如,構造參數化的特定查詢,以重用以前緩存過的執行計劃。
  • 對實際數據進行查詢的基礎上,構造代碼元素。例如,當事先不知道再PIVOT運算符的IN子句中應該出現哪些元素時,動態構造PIVOT查詢。


動態SQL執行方法

使用EXEC(EXECUTE的縮寫)命令和使用SP_EXECUTERSQL。

EXEC命令執行

語法

EXECUTE (SQL語句)

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

不帶參數示例

在變量@SQL中保存了一個字符串,該字符串中包含一條查詢語句,再用EXEC調用保存在變量中的批處理代碼,我們可以這樣寫SQL:

EXEC ('SELECT * FROM Customers')


結果如下:

SQL高級知識——動態SQL


與我們直接執行SELECT * FROM Customers一樣。

帶參數示例

還是上面的示例,我們換一種寫法

DECLARE @SQL AS VARCHAR(100);
DECLARE @Column AS VARCHAR(20);
SET @Column = '姓名'
SET @SQL = 'SELECT ' + @Column + ' FROM Customers';
EXEC (@SQL)


結果如下:

SQL高級知識——動態SQL


SP_EXECUTERSQL執行

語法

EXEC SP_EXECUTERSQL 參數1,參數2,參數3


注意:SP_EXECUTERSQL是繼EXEC後另一種執行動態SQL的方法。使用這個存儲過程更加安全和靈活,因為它支持輸入和輸出參數。注意的是,與EXEC不同的是,SP_EXECUTERSQL只支持使用Unicode字符串作為其輸入的批處理代碼。

示例

構造了一個對Customers表進行查詢的批處理代碼,在其查詢過濾條件中使用一個輸入參數@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;


結果如下:

SQL高級知識——動態SQL


代碼中將輸入參數取值指定為1,但即使採用不同的值在運行這段代碼,代碼字符串仍然保存相同。這樣就可以增加重用以前緩存過的執行計劃的機會。

批註

動態SQL在日常工作中可能接觸的比較少,但是其功能是非常強大的,可以直接嵌套在代碼裡進行操作數據,但是也很容易出錯,特別是在進行命令拼接時候要非常仔細。這裡只是給大家簡單介紹一下其使用方法,需要深入使用還需要多多研究。

相關推薦

推薦中...