2013-11-04 80 views
1

我试图设置变量,其名称是在存储过程中动态:SQL:动态变量名

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

你为什么需要名称是动态的?你试图解决的更大的问题是什么? –

+0

你想达到什么目的?事实上,动态SQL有它自己的范围 – jazzytomato

+0

您是否尝试过使用'@@'变量? – Kermit

回答

3

嗯,这是不漂亮,但你可以这样做:

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>; 
+0

+1 _“这应该是非常不愉快的,你可能会想到替代品。”_ –

0

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

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 
;

我甚至怀疑有也可能以这样的方式,以避免您的评论都在提光标做的一切的可能性。