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

Sim*_*ons 1 t-sql sql-server 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)
Run Code Online (Sandbox Code Playgroud)

当我执行这个时,我收到一个错误,

必须声明标量变量“@TagNames”。

Iva*_*tin 5

它肯定不是全局变量。您必须在动态 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
Run Code Online (Sandbox Code Playgroud)

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