本篇文章圖片毀損,完整版請參考: https://dog0416.blogspot.com/2020/10/sql-spexecutesql.html

個人接觸到動態組合與執行 SQL 方法,主要在執行 SP 階段,必須動態取得的不同資料庫名稱 (同主機),故執行跨資料庫存取資料的時候需要動態語法。實際上若並非必要,個人不太喜歡動態組合語法,主因是非常的難以測試,尤其是執行非常長的語法,讓除錯的困難度增加不少。

我們先來介紹簡單使用 sp_executesql,我們的情境案例為替換掉資料庫名稱即可。首先要執行的語法設定為字串

DECLARE @query NVARCHAR(MAX) = N'
 SELECT *
   FROM [Study4TW].[dbo].[Activity];'
SET @query = REPLACE(@query,N'[Study4TW]','[DIStudio]');
EXEC SP_EXECUTESQL @query;   

若需要帶入參數,語法為

EXEC SP_EXECUTESQL 執行語法, 帶入參數型態, 帶入參數;
DECLARE @query NVARCHAR(MAX) = N'
 SELECT *
   FROM [Study4TW].[dbo].[Activity]
  WHERE Id = @id ;'
EXEC SP_EXECUTESQL @query, N'@id int', @id = 1;

依據官方網站的建議:

sp_executesql 會比 EXECUTE 更具有多變性;同時由於 sp_executesql 所產生的執行計畫更能讓 SQL Server 重複使用,因此 sp_executesql 也會比 EXECUTE 更有效率 (參考資料 1)

故建議使用 sp_executesql 代替直接使用 EXECUTE

  • 使用 sp_executesql - https://technet.microsoft.com/zh-tw/library/ms175170(v=sql.105).aspx
  •