2015-02-11 143 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