sql server中的变量问题

时间:2017-08-31 06:17:43

标签: sql-server sql-server-2008

Declare @week1 varchar(max)='value 1'
Declare @week2 varchar(max)='value 2'
declare @sql varchar(max)
declare @i int=1
while(@i<=2)
begin
set @sql='print @week'+cast(@i as varchar(6))+''
exec(@sql)
set @i=@i+1
end

执行此操作后,我收到错误消息:

  

Msg 137,Level 15,State 2,Line 2必须声明标量变量   “@ week1”。 Msg 137,Level 15,State 2,Line 2必须声明标量   变量“@ week2”。

1 个答案:

答案 0 :(得分:3)

这是一个范围问题。除非在动态sql中声明变量,否则无法从动态sql中访问变量。如果您将EXEC(@sql)更改为print(@sql),您将看到您正在尝试执行的是...

print @week1
print @week2

如果您正在寻找以下结果......

value 1
value 2

...然后尝试将代码更改为此...

DECLARE @sql VARCHAR(MAX) = 'DECLARE @week1 VARCHAR(MAX) = ''value 1'', @week2 VARCHAR(MAX) = ''value 2'';';
DECLARE @i INT = 1;
WHILE (@i <= 2)
BEGIN
    SET @sql = @sql + ' print @week' + CAST(@i AS VARCHAR(6)) + '';
    SET @i = @i + 1;
END;
EXEC (@sql);

...生成并执行此...

DECLARE @week1 VARCHAR(MAX) = 'value 1', @week2 VARCHAR(MAX) = 'value 2'; print @week1 print @week2