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”。
答案 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