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

Sql server SQL EXEC(@QUERY)无权访问全局变量,sql-server,tsql,variables,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 + '','','''') +

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

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

因此,我的查询如下所示:

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”


它肯定不是一个全局变量。您必须在动态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及其参数声明必须是NVarchar。

它肯定不是全局变量。您必须在动态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及其参数声明必须是NVarchar。

对于exec sp_executesql,获取错误,字符串“@TagNames VARCHAR(MAX)OUTPUT)”后未闭合的引号。@@TagNames OUTPUT,如果我用引号关闭exec sp_executesql@@QUERY,N'@@TagNames VARCHAR(MAX)OUTPUT),@@@TagNames输出“在”“附近获取错误语法”。我不适合@(double@),所以不允许我使用single@typo fixed(was
,而不是
)。谢谢,如果您不介意后续问题,我如何向查询中添加一个额外的参数来替换硬编码的fldUnitId值。我尝试使用exec sp_executesql'@QUERY,N'@IPSet-VARCHAR(50),@TagNames-VARCHAR(MAX)OUTPUT','@TagNames-OUTPUT',但由于出现此错误,形式参数“@IPSet”未声明为输出参数,而是在请求的输出中传递了实际参数。更新了此参数,它正在工作,exec sp_executesql@QUERY,N'@IPSet-VARCHAR(50),@标记名VARCHAR(MAX)OUTPUT','@IPSet,@TagNames OUTPUTon exec sp_executesql,获取错误,字符串'@TagNames VARCHAR(MAX)OUTPUT'后未关闭引号。@@TagNames OUTPUT,如果我用QUOTES exec sp_executesql@@QUERY关闭,N'@@TagNames VARCHAR(MAX)OUTPUT),@@@TagNames输出“在”“附近获取错误语法”。我不适合@(double@),所以不允许我使用single@typo fixed(was
,而不是
)。谢谢,如果您不介意后续问题,我如何向查询中添加一个额外的参数来替换硬编码的fldUnitId值。我尝试使用exec sp_executesql'@QUERY,N'@IPSet-VARCHAR(50),@TagNames-VARCHAR(MAX)OUTPUT','@TagNames-OUTPUT',但由于出现此错误,形式参数“@IPSet”未声明为输出参数,而是在请求的输出中传递了实际参数。更新了此参数,它正在工作,exec sp_executesql@QUERY,N'@IPSet-VARCHAR(50),@标记名VARCHAR(MAX)输出','@IPSet,@TagNames输出