SQL:动态变量名称

Jam*_*ons 1 sql t-sql sql-server sql-server-2005

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

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)
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为变量声明的范围与动态sql的范围不同.

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

Gor*_*off 5

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

if @loopcntr = 1
    set var01 = 'somevalue'
else if @loopcntr = 2
    set var02 = 'whatever'
else if . . .
Run Code Online (Sandbox Code Playgroud)

这应该是令人不愉快的,你可能会想到替代品.哦,这是一个很好的.定义一个表变量,只为每个值添加行:

declare @vars table (
    id int identity(1, 1),
    loopcntr int,
    value varchar(255)
);

. . .
-- inside the loop
    insert into @vars(loopcntr, value)
        select @loopcntr, 'whatever';
Run Code Online (Sandbox Code Playgroud)

如果要获取变量,可以执行以下操作:

declare @var varchar(255);
select @var = value from @vars where loopcntr = <the one I want>;
Run Code Online (Sandbox Code Playgroud)

  • +1 _“这应该足够令人不愉快,你可能会想到替代方案。”_ (2认同)