2017-08-31 70 views
1
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 @[email protected]+1 
end 

變量執行此我得到錯誤說後:問題在SQL Server中

消息137,級別15,狀態2,2行必須聲明標量變量 「@ week1」。消息137,15級,狀態2,行2必須聲明標量 變量「@ week2」。

+0

看看[這裏](https://stackoverflow.com/questions/7181976/must-declare-the-scalar-variable) – Fmanin

+0

執行的SQL不包含week1或week2的聲明。 –

+0

我需要打印@ week1的值,並且很快 –

回答

3

這是一個範圍問題。除非您在動態sql中聲明它們,否則不能從動態sql中訪問變量。如果更改EXEC(@sql)打印(@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 
+0

我不應該硬編碼值,實際上這些是我在這裏提到的變量參數。 –