2

我正在尝试在存储过程中设置名称为动态的变量:

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 不同的范围内声明的。

以这种方式动态设置变量的正确方法是什么?

4

3 回答 3

6

好吧,它并不漂亮,但你可以这样做:

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>;
于 2013-11-04T17:14:59.653 回答
0

您还可以使用允许传递参数的存储过程 sp_executesql。虽然我建议使用附加表来存储变量。

于 2013-11-04T19:20:16.400 回答
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
;

我什至怀疑也有可能以避免您在评论中提到的光标的方式来做所有事情。

于 2013-11-05T07:12:52.117 回答