sql server中的变量问题

Posted

技术标签:

【中文标题】sql server中的变量问题【英文标题】:Issue with the variables in sql server 【发布时间】:2017-08-31 06:17:43 【问题描述】:
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”。

【问题讨论】:

看看here 执行的SQL不包含第1周或第2周的声明。 我需要打印@week1 和很快的值 我觉得你的变量个数是固定的,可以用CASE WHEN 打印出来。 【参考方案1】:

这是范围问题。除非您在动态 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

【讨论】:

我不应该对这些值进行硬编码,实际上这些是我在这里提到的过程的参数,就像变量一样。

以上是关于sql server中的变量问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 中的截断/清除表变量

SQL Server:在存储过程中的变量中存储多个值

将表定义克隆到 SQL Server 中的表变量

如何将插入的输出值分配给 sql server 中的变量? [复制]

SQL Server 中的临时表和表变量有啥区别?

SQL Server 查询中的动态表名和变量名