【问题标题】:Dynamix SQL Error "Must declare the scalar variable"Dynamix SQL 错误“必须声明标量变量”
【发布时间】:2022-01-12 09:13:15
【问题描述】:

我声明了@inAdd1-6 和@inAdd。 @inAdd1-6 实际上会被传递到存储过程中。

然后我将拆分它们并处理地址,一些作为单个地址,而另一些则用于比较名称、街道、邮政编码等。

我希望我可以根据需要动态更改每个@inAdd 来处理它,即SET @inAdd = @inAdd#

DECLARE
    @id nvarchar(255)        = '[uid]',
    @table      varchar(255) = '[sub_customer]',
    @company    varchar(255) = '',
    @inAdd nvarchar(max)     = '',
    @inAdd1 nvarchar(max)    = 'BLANK,[Invoice Street],BLANK,BLANK,BLANK,[Invoice City],[Invoice State],[Invoice Zip],[Invoice Country]',
    @inAdd2 nvarchar(max)    = '[Shipping Name],[Shipping Street],BLANK,BLANK,BLANK,,[Shipping City],[Shipping State],[Shipping Zip],[Shipping Country]',
   @inAdd3  nvarchar(max)    = '[UPS Company],[UPS Street],BLANK,BLANK,BLANK,,[UPS City],[UPS State],[UPS Zip],[UPS Country]',
   @inAdd4  nvarchar(max)    = '[FedEx Name],[FedEx Street],BLANK,BLANK,BLANK,,[FedEx City],[FedEx State],[FedEx Zip],[FedEx Country]',
   @inAdd5  nvarchar(max)    = 'BLANK,[UPS From Street],BLANK,BLANK,BLANK,,[UPS From City],[UPS From State],[UPS From Zip],[UPS From Country]',
   @inAdd6  nvarchar(max)    = 'BLANK,[FedEx From Street],BLANK,BLANK,BLANK,,[FedEx From City],[FedEx From State],[FedEx From Zip],[FedEx From Country]',

WHILE (@addCnt >= @cnt)
BEGIN
    SET @var = '@inAdd' + CAST(@cnt AS nvarchar(3))
    PRINT @var
    SET @sql = 'SET @inadd = ' + @var
    PRINT @sql
    EXEC sp_executesql @sql
    SET @cnt = @cnt + 1
    ... code to process @inAdd
END

PRINT 中的@sql 是SET @inadd = @inAdd1,这正是我想要的。但是,当我使用 sp_executesql 时出现错误。

如果将SET @inadd = @inAdd1(或任何其他@inAdd#)作为单独的命令输入,它可以正常工作。

【问题讨论】:

  • 如果你传入10000行,你声明@inAdd1-10000?
  • @cnt 在哪里定义?不确定这是否重要,但在 DECLARE 的末尾,@inAdd6 的末尾似乎多了一个逗号。

标签: sql variables dynamic-sql variable-declaration


【解决方案1】:

您使用 EXEC 执行生成的语句,因此您调用了一个新实例,该实例不知道您在基本脚本中所做的任何声明 您必须将声明添加到新脚本中

WHILE (@addCnt >= @cnt)
BEGIN
    SET @var = '@inAdd' + CAST(@cnt AS nvarchar(3))
    PRINT @var
    SET @sql = 'DECLARE ' + @var + ' nvarchar(50); DECLARE @inadd nvarchar(50); SET @inadd = ' + @var
    PRINT @sql
    EXEC sp_executesql @sql
    SET @cnt = @cnt + 1
    ... code to process @inAdd
END

更新: 考虑到您对需求的确切定义,我建议您考虑其他方法:

  1. 将你的地址数据导入到导入表中,然后使用sql脚本处理该表中的所有行

  2. 编写一个简单的命令行工具来处理您的地址(可能与处理单行的 sql 脚本有关)

  3. 如果您在 SQL-Server 上:

    3.1) 将您的地址数据作为“用户定义的表类型”传递

    3.2) 将您的地址数据作为一个大字符串传递,并在脚本中使用分隔符 und 拆分字符串,并将结果插入临时表中,然后处理表中的所有行

最好的问候, 吉米

【讨论】:

  • 除了整个目的是将值设置为我已经声明和设置的变量。我试图避免使用一堆IF (@cnt = 2) SET @inAdd = @inAdd2,因为这次可能有 50 个,下个月有 10 个,下个月有 10,000 个。
  • 但简单地说,这是不可能的——执行是在一个新实例中完成的,这个实例不知道在另一个实例中完成的任何声明。也许描述一下你到底想解决什么问题
  • 我更新了问题
  • 我选择了选项 1 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
相关资源
最近更新 更多