【问题标题】:How can I concatenate stringvalues in a parameter definition for a sp_executesql statement?如何在 sp_executesql 语句的参数定义中连接字符串值?
【发布时间】:2021-10-11 14:55:19
【问题描述】:

我正在尝试将字符串参数连接到 sp_executesql 语句,但找不到方法。我很可能没有在净资产中搜索到正确的词。我想要做的可以用下面的代码来举例说明,我希望 sp_executesql 语句给出与我的第一个打印语句相同的结果 (print(@t1 + @t2):

declare @r nvarchar(max), @t1 nvarchar(2), @t2 nvarchar(2)
set @t1 = 'AA'
set @t2 = 'BB'
print(@1 + @t2)
set @r = 'print(@t)'
exec sp_executesql @r, N'@t nvarchar(100)', @t = ?

我试过了:

@t = @t1 + @t2

@t = concat(@t1, @t2)

我的第一个问题:这是否可能(我猜是)?实际上,这是关于在多个表上进行调整和计算。表名由三部分组成;前缀、名称和后缀。每次迭代所涉及的数据库和部分表名都会以不同的方式发生变化。在这种特殊情况下,第一次迭代是使用一个数据库和一个表。第二次迭代改变了数据库和表名。第三次迭代与第二次迭代使用相同的数据库,相同的前缀和名称,但具有不同的后缀,依此类推。这可以通过表名的不同部分的变量来解决,这些变量在每次迭代时连接到“database.schema.table 名称”。

我的第二个问题:应该如何编写代码才能使其工作(如果可能的话)?

【问题讨论】:

  • 你为什么首先在这里使用sys.sp_executesql?您真正想在这里实现什么? sys.sp_executesql通常用于要执行动态SQL时;你这里没有动态 SQL。
  • 我需要遍历几个表并为每个循环更改 5 个变量,其中 2 个取决于其他 1 个的值和另外 4 个在这部分中是静态的“全局”变量代码。今天我们用大量的代码来解决这个问题,这对维护来说是一场噩梦,我认为也许 sp_executesql 可能是解决方案。否则,我将使用一系列 if 语句来解决它……(或者如果我被允许,则使用 Python……我不是)。 :)
  • 向我们展示您在此处尝试解决的真正问题,而不是问题 Y。请参阅XY Problem
  • 对我上面的第一个问题做了一些额外的解释。代码被锁定在一个安全的环境中,我无法从那里导出它。
  • 这并不能解释你真正想要达到的目标,@MarJer。你所说的循环和“全局变量”在哪里(你的意思是像@@VERSION吗?)。

标签: tsql sp-executesql


【解决方案1】:

和其他人一样,我仍然不确定你在这里要做什么,但我猜测,我建议你这样尝试:

declare @r nvarchar(max), @t1 nvarchar(2), @t2 nvarchar(2)
set @t1 = 'AA'
set @t2 = 'BB'
declare @t nvarchar(max)
set @t = @t1 + @t2        -- <-- added this
print(@t1 + @t2)
set @r = 'print(@t)'
exec sp_executesql @r, N'@t nvarchar(100)', @t = @t  -- <-- and this

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多