SQL Server

时间:2015-07-06 13:37:27

标签: sql-server tsql sql-server-2008-r2 dynamic-sql

我有这个动态代码:

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中起作用。

提前致谢。

1 个答案:

答案 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