Dynamix SQL 错误 "Must declare the scalar variable"
Dynamix SQL Error "Must declare the scalar variable"
我声明了@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#)作为单独的命令放入,它可以正常工作。
您使用 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
更新:
考虑到您对需求的确切定义,我建议您考虑其他方式:
将您的地址数据导入到导入 table,然后使用 sql 脚本处理此 table
中的所有行
编写一个简单的命令行工具来处理您的地址(可能与 sql 脚本一起处理单行)
如果您在SQL-服务器上:
3.1) 将您的地址数据作为“用户定义的 Table 类型”传递
3.2) 将地址数据作为一个带有分隔符的大字符串传递,并在脚本中拆分字符串,并将结果插入临时 table,然后处理 table 的所有行
此致,
吉米
我声明了@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#)作为单独的命令放入,它可以正常工作。
您使用 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
更新: 考虑到您对需求的确切定义,我建议您考虑其他方式:
将您的地址数据导入到导入 table,然后使用 sql 脚本处理此 table
中的所有行编写一个简单的命令行工具来处理您的地址(可能与 sql 脚本一起处理单行)
如果您在SQL-服务器上:
3.1) 将您的地址数据作为“用户定义的 Table 类型”传递
3.2) 将地址数据作为一个带有分隔符的大字符串传递,并在脚本中拆分字符串,并将结果插入临时 table,然后处理 table 的所有行
此致, 吉米