1. 程式人生 > >用sp_executesql執行動態SQL語句及獲得返回值

用sp_executesql執行動態SQL語句及獲得返回值

過去我執行拼湊出來的動態SQL語句,都直接使用EXEC @sql 的方式。有好幾次,都看到有資料說,應該儘量使用 sp_executesql。

究其原因,是因為僅僅引數不同的情況下,sp_executesql可以重用執行計劃,這不就有跟儲存過程一樣的優勢了嗎?同時,sp_executesql還可以提供動態SQL語句執行的返回值,方便得很。

但sp_executesql的使用方式看上去比較複雜,一點都不像EXEC那樣直觀。

用法:

EXEC sp_executesql SQL語句,引數宣告,引數

	CREATE TABLE #tmp(t INT NOT NULL,it DECIMAL(18,4),pt DECIMAL(18,4));
	INSERT INTO #tmp(t,it,pt) VALUES(1,10.00,15.00);
	INSERT INTO #tmp(t,it,pt) VALUES(2,20.00,30.00);

	DECLARE @sql NVARCHAR(2000) = N'SELECT @it=it,@pt=pt FROM #tmp WHERE 
[email protected]
;'; DECLARE @Param NVARCHAR(500) = N'@tN INT,@it DECIMAL(18,4) OUTPUT,@pt DECIMAL(18,4) OUTPUT'; DECLARE @tN INT,@it DECIMAL(18,4),@pt DECIMAL(18,4); SET @tN = 1; [email protected][email protected],第一個@tN是@Param裡的宣告,而第二個@tN則是外部的宣告,其他類似 EXEC sp_executesql @sql,@Param,@
[email protected]
,@[email protected] OUTPUT,@[email protected] OUTPUT; SELECT @it,@pt; DROP TABLE #tmp;

為什麼有返回值那麼重要呢?我在不知道這個用法以前,如果需要捕捉動態SQL語句裡的返回值,要借用表物件:

詳見拙作:

declare @sql NVARCHAR(MAX) = N'SELECT @i,@j;';
declare @paramdefine NVARCHAR(MAX) = N'@i INT,@j INT,@k INT=3';
exec sp_executesql @sql,@paramdefine,@i=1,@j=2;


相關推薦

sp_executesql執行動態SQL語句獲得返回

過去我執行拼湊出來的動態SQL語句,都直接使用EXEC @sql 的方式。有好幾次,都看到有資料說,應該儘量使用 sp_executesql。究其原因,是因為僅僅引數不同的情況下,sp_executesql可以重用執行計劃,這不就有跟儲存過程一樣的優勢了嗎?同時,sp_exe

存儲過程中執行動態Sql語句

查詢 需要 一點 定義 data 復制 ast 我們 臨時   在最近的項目中,有用到動態執行sql語句,SQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXE

怎樣SQL存儲過程中執行動態SQL語句

緩存 參數 insert 每次 一點 證明 record scac 清空緩存 MSSQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXEC沒有。還有一個最大的好

log4j2列印Mybatis執行SQL語句SQL語句執行時間

有關於log4j2的詳細配置方式,建議大家觀看log4j2配置檔案詳解,這裡不做介紹 一、首先如需使用log4j2,得引入maven依賴 <!-- log4j2 --> <dependency> <groupI

Java下拼接執行動態SQL語句

  在實際業務中經常需要拼接動態SQL來完成複雜資料計算,網上各類技術論壇都有討論,比如下面這些問題:   拼接動態SQL的一般做法有:   1、使用動態語句   很多資料庫都提供了處理動態SQL的語法,如Oracle的EXECUTE IMMEDIATE語

mysql儲存過程執行動態sql語句返回

Java程式碼 set @sql=’xxx’; prepare stmt from @sql; execute stmt; deallocate prepare stmt; select @curd1; set @sql=’xxx’; prepare stmt f

儲存過程中執行動態Sql語句

  MSSQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出介面,而EXEC沒有。還有一個最大的好處就是利用sp_executesql,能夠重用執行計劃,這就大大提供了執

oracle儲存過程中如何執行動態SQL語句

有時需要在oracle儲存過程中執行動態SQL語句 ,例如表名是動態的,或欄位是動態的,或查詢命令是動態的,可用下面的方法: set serveroutput ondeclare    n number;    sql_stmt varchar2(50);    t varc

mysql戶管理、常用sql語句數據庫的備份

mark ffffff sock 來源 rpm -ivh grant lease -i 安裝 一、mysql用戶管理 1、創建用戶(認用戶root,權限最高)grant all on . to ‘user1‘@‘localhost‘ identified by ‘passw

SQL語句5.7.2 mysql 戶管理

刪除數據庫 auth ren del 管理 dpa 創建 oot host 一、用戶的定義 1.1 用戶名+主機域 此處為5.7.2版本的mysql當中password字段已改為authentication_string mysql> select user,host

mybaits(查詢與別名、日誌框架顯示sql語句、物件屬性和資料庫表字段不匹配resultMap使用、mysql資料查詢分頁、執行sql和儲存過程、動態SQL語句

主要是各種配置檔案,建議把整個專案搬到自己電腦上慢慢看。 建立maven專案 首先是各種配置檔案: pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://m

執行動態 sql 併為 輸出引數賦sp_executesql 使用方法

sp_executesql  過程與 exec 關鍵字區別 sp_executesql  可以在動態 sql 中使用變數,並且將變數輸出 exec 則只能執行動態 sql 和 儲存過程(執行過程不需要加小括號,執行動態 sql 則必須加小括號) ----------------

獲得sql server最近執行sql語句

select top 1000 s2.dbid, DB_NAME(s2.dbid) as [dbname], (select top 1 substring(s2.text,statement_start_offset/2+1, ((case when statement_

Oracle--查詢正在執行執行過的SQL語句語句執行效能

--查詢Oracle正在執行和執行過的SQL語句及語句執行效能  -- 1.正在執行的 select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT   from v$session a, v$sqlarea b  where a.

返回動態SQL語句執行結果

--值,動態查詢結果返回 DECLARE @query NVARCHAR(MAX) DECLARE @testVal INT SET @query='select @testVal=

oracle 檢視session當前正執行sql近期執行sql語句

 ORACLE中可以通過v$session表檢視當前有效的session資訊,並且可以通過v$session的sql_id或sql_address通過關聯查詢v$sql檢視當前正在執行的sql語句;  如果我們想檢視session近期執行的sql語句,可以通過v$activ

sqlserver在觸發器中執行動態sql到inserted(deleted)表

  這兩天公司產品中要加個資料同步用的觸發器,oracle版沒什麼問題,很順利的寫完了。       在寫sqlserver版時遇到了麻煩。由於在觸發器中要根據inserted(deleted)表的資料,對另一個表進行更新操作,而這個表的某些欄位是不固定的,所以需要寫成動態

javaPrepareStatement實現多sql語句執行

try{ //連線資料庫 conn = ConnMysqlUtil.getConnection();//禁止自動提交(預設為自動提交,所以需要修改)conn.setAutoCommit(false);prst = conn.prepareStatement("update

MyBatis學習筆記-08.MyBatis動態Sql語句foreach的collection的用法以及foreach實現批量刪除與批量新增

本次將繼續記MyBatis動態Sql語句的choose和foreach:一、choose(較少應用):有時我們不想應用到所有的條件語句,而只想從中擇其一項。針對這種情況,MyBatis 提供了 choo

動態sql語句基本語法--Exec與Exec sp_executesql 的區別

動態sql語句基本語法    1   :普通SQL語句可以用Exec執行    eg:       Select   *   from   tableName                      Exec( 'select   *   from   tableName ')