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'
哇,这太容易了,我很惭愧。有了参数已经在那里,我没有得到那些正在被替换,并且相当的呼叫是“执行ordertest 2,1”。谢谢! – Jokin 2015-02-11 15:14:58
没问题。您也可以重命名它们,这样读起来就不那么容易混淆,但它的工作原理是一样的。 – 2015-02-11 15:17:38
只是想添加一个注释,虽然这看起来很混乱,但它看起来是将命名参数与参数化查询结合起来的正确方法。例如,nLog允许您提供命令文本来运行以插入日志条目,而'exec ProcName @Param1 = @Param1,@Param2 = @Param2'就是这样做的方法。 'sp_executesql'正确替换这些参数值。谢谢你的答案。 – Nick 2015-06-26 21:50:57