2015-02-11 81 views
2

有什麼方法可以調用sp_executesql,而參數不依賴於它們在存儲中定義的順序嗎?與exec相同的查詢效果很好,如果你有相同的順序它也可以很好地工作,但是它必須逐個匹配參數,因爲有時候我會用helper動態地調用這個調用,並且如果dto對象不能在相同的順序中沒有相同的字段,不能很好地工作。sp_executesql中的命名參數

create procedure ordertest 
    @PARAM1 INT, 
    @PARAM2 INT 
    AS 
BEGIN 
SELECT @PARAM1 AS ONE, @PARAM2 AS TWO 
END 

-- this works 
EXEC ordertest @PARAM1 = 1, @PARAM2 = 2 
exec sp_executesql N'exec ordertest @PARAM1, @PARAM2', N'@param1 int, @param2 int', @param2 = '2', @param1 = '1' 
EXEC ordertest @PARAM2 = 2, @PARAM1 = 1 

-- this doesn't work 
exec sp_executesql N'exec ordertest @PARAM2, @PARAM1', N'@param1 int, @param2 int', @param2 = '2', @param1 = '1' 

回答

7

當然你可以這樣做。你只需要添加當你調用它時使用哪個參數。

exec sp_executesql N'exec ordertest @PARAM2 = @Param2, @PARAM1 = @Param1', N'@param1 int, @param2 int', @param2 = '2', @param1 = '1' 
+0

哇,這太容易了,我很慚愧。有了參數已經在那裏,我沒有得到那些正在被替換,並且相當的呼叫是「執行ordertest 2,1」。謝謝! – Jokin 2015-02-11 15:14:58

+0

沒問題。您也可以重命名它們,這樣讀起來就不那麼容易混淆,但它的工作原理是一樣的。 – 2015-02-11 15:17:38

+0

只是想添加一個註釋,雖然這看起來很混亂,但它看起來是將命名參數與參數化查詢結合起來的正確方法。例如,nLog允許您提供命令文本來運行以插入日誌條目,而'exec ProcName @Param1 = @Param1,@Param2 = @Param2'就是這樣做的方法。 'sp_executesql'正確替換這些參數值。謝謝你的答案。 – Nick 2015-06-26 21:50:57