本篇文章圖片毀損,完整版請參考: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