【问题标题】:named parameters in sp_executesqlsp_executesql 中的命名参数
【发布时间】:2015-02-11 14:45:18
【问题描述】:

有没有什么方法可以调用 sp_executesql 的参数不依赖于它们在存储中定义的顺序?与 exec 相同的查询运行良好,如果您有相同的顺序,它也运行良好,但必须一个一个匹配参数是很痛苦的,因为有时我会使用助手动态生成调用,如果 dto 对象不'没有相同顺序的相同字段,效果不好。

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'

【问题讨论】:

    标签: sql-server tsql dapper sp-executesql


    【解决方案1】:

    当然可以。你只需要在调用时添加哪个参数是哪个。

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

    【讨论】:

    • 哇,这太容易了,我很惭愧。由于参数已经存在,我没有得到那些被替换的参数,等效的调用是“exec ordertest 2, 1”。谢谢!
    • 没问题。您也可以重命名它们,这样阅读起来不会那么混乱,但它的工作原理是一样的。
    • 只是想添加一个说明,虽然这看起来令人困惑,但它似乎是将命名参数与参数化查询结合起来的正确方法。例如,nLog 允许您提供命令文本以运行以插入日志条目,exec ProcName @Param1=@Param1, @Param2=@Param2 就是这样做的方法。 sp_executesql 正确替换了这些参数值。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多