我试图使用分配给初始@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”。
需要输出
答案 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