我有这个动态代码:
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中起作用。
提前致谢。
答案 0 :(得分:2)
在动态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