EXEC與sp executesql的區別及應用

2021-09-07 07:51:52 字數 1722 閱讀 1135

在專案中需要將內部declare的引數通過exec賦值後再作為下面乙個exec引數的時候,發現都使用exec時,問題就不是那麼簡單了。

趁著沒有睡意研究下。

exec的使用與缺點

exec命令有兩種用法,一種是執行乙個儲存過程,另一種是執行乙個動態的批處理

一般的使用如下,做動態sql語句拼接,然後執行

然而上面這樣的拼接語句又稱為「串聯變數」,而串聯變數是不支援執行計畫的,在我的演示**中我已加了測試的sql語句。

使用dbcc freeproccache清空快取。(具體使用可以檢視ms的msdn:

在輸出的資料中我們很清楚的看到系統執行了兩次,沒有很好地使用執行計畫

而最重要的是當我有下面這樣的需求

出錯啦!

然而我們發現這樣的需求變相也是可以滿足的,就是有點麻煩了,解決方案如下,使用臨時表

sp_executesql的使用

使用sp_executesql的話,一切將變的很簡單

sp_executesql命令比exec命令更靈活,因為它提供乙個介面,該介面及支援輸入引數也支援輸出引數。這功能使你可以建立帶引數的查詢字串,這樣就可以比exec更好的重用執行計畫,sp_executesql的構成與儲存過程非常相似,不同之處在於你是動態構建**。它的構成包括:**快,引數宣告部分,引數賦值部分。

sp_executesql的語法

exec sp_executesql

@stmt = ,--類似儲存過程主體

@params = , --類似儲存過程引數部分

--類似儲存過程呼叫

@stmt引數是輸入的動態批處理,它可以引入輸入引數或輸出引數,和儲存過程的主體語句一樣,只不過它是動態的,而儲存過程是靜態的,不過你也可以在儲存過程中使用sp_executesql;

@params引數與定義輸入/輸出引數的儲存過程頭類似,實際上和儲存過程頭的語法完全一樣;

@與呼叫儲存過程的exec部分類似。

現在我們按照sp_executesql的語法改造下上面的查詢

檢視執行計畫的呼叫,很好的利用了已有的執行計畫提公升查詢效率

我們再去看上面那個需要使用臨時表的問題

**如下,可以將@titleoutput取出後再作為查詢的引數給@titleinput賦值。

難題得解!

exec 與system 的區別

這應該算是老生長談的問題了,在此做乙個記錄。執行exec 後,老的程序上下文將被exec出來的新的程序上下文覆蓋,新程序代替原程序執行。執行system 後則相當於fork 出乙個子程序,並等待此子程序執行完畢。請看如下程式以加深理解。rt.c int main gcc rt.c o rt test...

exec 與system 的區別

這應該算是老生長談的問題了,在此做乙個記錄。執行exec 後,老的程序上下文將被exec出來的新的程序上下文覆蓋,新程序代替原程序執行。執行system 後則相當於fork 出乙個子程序,並等待此子程序執行完畢。請看如下程式以加深理解。cpp view plain copy rt.c intmain...

exec 與system 的區別

這應該算是老生長談的問題了,在此做乙個記錄。執行exec 後,老的程序上下文將被exec出來的新的程序上下文覆蓋,新程序代替原程序執行。執行system 後則相當於fork 出乙個子程序,並等待此子程序執行完畢。請看如下程式以加深理解。cpp view plain copy print?rt.c i...