我试图在存储过程中设置名称为动态的变量:
DECLARE @var01 varchar(50)
DECLARE @var02 varchar(50)
...
DECLARE @var30 varchar(50)
DECLARE @sql = varchar(max)
DECLARE @loopcnter INT
-- (Inside some loop where the loopcounter increments each iteration)
...
SET @sql = 'SET @var0'+CAST(@loopcntr AS Varchar)+'= '''+'somevalue'+''''
-- e.g.) SET @var01= 'somevale'
EXEC (@sql)
这不起作用,因为变量声明的范围与动态sql的范围不同。
以这种方式动态设置变量的正确方法是什么?
答案 0 :(得分:5)
嗯,它不漂亮,但你可以这样做:
if @loopcntr = 1
set var01 = 'somevalue'
else if @loopcntr = 2
set var02 = 'whatever'
else if . . .
这应该是令人不愉快的,你可能会想到其他选择。哦,这是一个很好的。定义一个表变量,只为每个值添加行:
declare @vars table (
id int identity(1, 1),
loopcntr int,
value varchar(255)
);
. . .
-- inside the loop
insert into @vars(loopcntr, value)
select @loopcntr, 'whatever';
如果您想获得变量,可以执行以下操作:
declare @var varchar(255);
select @var = value from @vars where loopcntr = <the one I want>;
答案 1 :(得分:0)
您还可以使用允许传递参数的存储过程sp_executesql。虽然 我建议使用附加表来存储变量。
答案 2 :(得分:0)
由于您在评论中说您只是为了将指定的值插入表中而分配变量集,因此您可以使用完全避免变量的方法。您可以将所有值插入临时表或表变量,为它们提供数字索引,然后转动值列并将结果行插入目标表。所以,像这样:
DECLARE @values TABLE (Ind int IDENTITY(1,1), Value varchar(50));
INSERT INTO @values
SELECT ...
;
INSERT INTO TargetTable (Col1, Col2, ..., Col30)
SELECT [1], [2], ..., [30]
FROM @values
PIVOT (
MAX(Value) FOR Ind IN ([1], [2], ..., [30])
) AS p
;
我甚至怀疑也有可能以避免你在评论中提到的光标的方式做所有事情。