動態sql SQL高階知識 動態SQL

2021-10-14 19:46:16 字數 1951 閱讀 4627

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

靜態sql

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

動態sql

動態 sql 語句是在應用程式執行時被編譯和執行的,例如,使用 db2 的互動式工具 clp 訪問資料庫時,使用者輸入的 sql 語句是不確定的,因此 sql 語句只能被動態地編譯。動態 sql 的應用較多,常見的 cli 和 jdbc 應用程式都使用動態 sql。

動態sql作用

動態sql執行方法

使用exec(execute的縮寫)命令和使用sp_executersql。

exec命令執行

語法

execute (sql語句)
注:execute 命令有兩個用途,乙個是用來執行儲存過程,另乙個是執行動態sql

不帶引數示例

在變數@sql中儲存了乙個字串,該字串中包含一條查詢語句,再用exec呼叫儲存在變數中的批處理**,我們可以這樣寫sql:

exec ('select * from customers')
結果如下:

與我們直接執行select * from customers一樣。

帶引數示例

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

declare @sql as varchar(100);declare @column as varchar(20);set @column = '姓名'set @sql = 'select ' + @column + ' from customers';exec (@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 customerswhere 客戶id=@cusid;';exec sp_executesql @stmt=@sql, @parms=n'@cusid as int', @cusid=1;
結果如下:

**中將輸入引數取值指定為1,但即使採用不同的值在執行這段**,**字串仍然儲存相同。這樣就可以增加重用以前快取過的執行計畫的機會。

批註

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

mybatis 動態SQL,sql裡使的各種標籤

id getempsbyconditionif resulttype com.mybatis.bean.employee select from tbl employee test id null id if test lastname null lastname and last name lik...

mysql動態sql無效 mysql 動態sql

解析類 xmllanguagedriver 可以通過setting 中的配置解析類。xmlscriptbuilder 動態sql 語句 bind bindhandler and 通過ognl 計算值,賦值給變數 foreachhandler forecah 標籤的解析解析 select from b...

高階路由(動態)

一 簡述 動態路由協議通過路由資訊的交換生成並維護 引擎所需的路由表。當網路拓撲結構改變時動態路由協議可以自動更新路由表,並負責決定資料傳輸最佳路徑。在動態路由中,管理員不再需要與靜態路由一樣,手工對路由器上的路由表進行維護,而是在每台路由器上執行乙個路由協議。這個路由協議會根據路由器上的介面的配置...