前言
個人接觸到動態組合與執行 SQL 方法,主要的情境在執行 SP 階段,需要動態取得的不同資料庫名稱 (同主機),執行跨資料庫存取資料的時候需要動態語法。實際上若並非必要,個人不太喜歡動態組合語法,主因是非常的難以測試,尤其是執行非常長的語法,讓除錯的困難度增加不少。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DECLARE @query NVARCHAR(MAX) = N' | |
SELECT * | |
FROM [Study4TW].[dbo].[Activity];' | |
SET @query = REPLACE(@query,N'[Study4TW]','[DIStudio]'); | |
EXEC SP_EXECUTESQL @query; |
若需要帶入參數,語法為
EXEC SP_EXECUTESQL 執行語法, 帶入參數型態, 帶入參數;
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
參考資料
1. 使用 sp_executesql - https://technet.microsoft.com/zh-tw/library/ms175170(v=sql.105).aspx
0 留言