SQL 服务器中动态 SQL 中的变量范围

scope of the variable in dynamic SQL in SQL server

我得到了这个动态代码:

declare @TableName varchar(100)='Customer'
declare @DestinationcolumnList  NVARCHAR(MAX)
DECLARE @ServerName NVARCHAR(100) = '----'
DECLARE @SourceDatabase NVARCHAR(100) = 'Staging'
DECLARE @DestinationDatabase NVARCHAR(100) = 'History'
declare @SQL NVARCHAR(MAX)
set @SQL='
select  
        '+@DestinationcolumnList+' = coalesce('+@DestinationcolumnList+', '''') +'',''+ char(13) + char(10) + quotename(cast(d.COLUMN_NAME as varchar(128)))
from ['+@ServerName+'].['+@DestinationDatabase+'].INFORMATION_SCHEMA.COLUMNS d
inner join ['+@ServerName+'].['+@SourceDatabase+'].INFORMATION_SCHEMA.COLUMNS s 
        on d.TABLE_NAME = s.TABLE_NAME  
        and s.COLUMN_NAME = d.COLUMN_NAME
where   d.TABLE_NAME = '''+@TableName+'''
order by d.ORDINAL_POSITION
'
exec sp_executesql @SQL
select @DestinationcolumnList

它给出了 NULL 值。当我在没有动态 SQL 的情况下执行相同的代码时,它工作正常。变量的范围如何在动态 SQL.

中工作

提前致谢。

在动态 SQL 中,在动态字符串外部声明的变量用于构建字符串,它们不用作字符串的一部分,因此不能按照您尝试的方式使用它们: 在 SELECT 语句中执行未记录的技巧,将变量与其自身连接以生成单个字符串。

如果您将变量声明作为字符串的一部分,它应该可以工作:

set @SQL='
declare @DestinationcolumnList  NVARCHAR(MAX);

select  
        @DestinationcolumnList = coalesce(@DestinationcolumnList, '''') +'',''+ char(13) + char(10) + quotename(cast(d.COLUMN_NAME as varchar(128)))
from ['+@ServerName+'].['+@DestinationDatabase+'].INFORMATION_SCHEMA.COLUMNS d
inner join ['+@ServerName+'].['+@SourceDatabase+'].INFORMATION_SCHEMA.COLUMNS s 
        on d.TABLE_NAME = s.TABLE_NAME  
        and s.COLUMN_NAME = d.COLUMN_NAME
where   d.TABLE_NAME = '''+@TableName+'''
order by d.ORDINAL_POSITION;

select @DestinationcolumnList;
'

exec sp_executesql @SQL