设置新变量时无法识别声明的变量

时间:2019-01-16 20:47:23

标签: sql sql-server tsql

我试图使用分配给初始@period变量的值编写SET查询,但是SET中未识别该变量。我该如何做,以便只需要声明一次期限?

当我在SET中声明@period时,将显示正确的输出。但是,我只需要在顶部有一个@period声明即可与多个SET一起使用。

DECLARE @period VARCHAR(15) = '01/01/2018'
SET @SQL = 'SELECT col1, col2, right(@period,4) + left(@period,2)
            FROM table' 
print(@SQL)
exec(@SQL)

错误:必须声明标量变量“ @period”。

需要输出

2 个答案:

答案 0 :(得分:2)

您需要使用动态SQL。我建议:

DECLARE @period VARCHAR(15) = '01/01/2018';

SET @SQL = N'SELECT col1, col2, right(@period,4) + left(@period,2)
            FROM table' ;

print(@SQL)

exec sp_executesql @sql, '@period varchar(15)', @period=@period;

确保将@sql声明为NVARCHAR()

答案 1 :(得分:2)

变量只能在上下文中引用,并且可以批量声明它们。如果您使用的是“动态” SQL(SQL没有动态变化),则该语句在单独的上下文中运行且无法引用。例如:

drop_duplicates

您需要使用DECLARE @i int = 1; EXEC (N'SELECT @i;'); 将值作为参数传递给动态SQL。例如:

sp_executesql