SQL EXEC(@QUERY)无权访问全局变量

时间:2018-03-14 06:04:35

标签: sql-server tsql variables

我正在编写一个需要动态附加数据库名称的查询。

查询从表中获取值(在另一个数据库中),我想知道是否有更好的方法/方式。

所以我的查询如下:

DECLARE @TagNames AS VARCHAR(MAX) --Probably this is not a Global variable
DECLARE @QUERY AS VARCHAR(MAX)

        SET @QUERY ='SELECT @TagNames = coalesce( @TagNames + '','','''') +    
                     fldTagName FROM '+ dbo.fnGetZiConfigValue('KEYNAME')+'.dbo.tblTags Where  
                     fldInterpolate = 1 AND fldUnitID = 13'

        EXEC (@QUERY)

当我执行此操作时,我收到错误,

  

必须声明标量变量" @ TagNames"。

1 个答案:

答案 0 :(得分:4)

肯定不是全局变量。你必须在动态SQL中“声明”它并返回外部,就像你用存储过程一样。

DECLARE @TagNames AS VARCHAR(MAX) --Probably this is not a Global variable
DECLARE @QUERY AS NVARCHAR(MAX)
    SET @QUERY = N'SELECT @TagNames = coalesce( @TagNames + '','','''') +    
                 fldTagName FROM '+ QUOTENAME(dbo.fnGetZiConfigValue('KEYNAME'))+'.dbo.tblTags Where  
                 fldInterpolate = 1 AND fldUnitID = 13'

exec sp_executesql @QUERY, N'@TagNames VARCHAR(MAX) OUTPUT', @TagNames OUTPUT

对于sp_executesql动态sql,它的params声明必须是NVarchar。