假设您在两个表中具有相同的列名,这样应该可以:
DECLARE @SchemaName varchar(64),
@TargetTableName varchar(64),
@SourceTableName varchar(64),
@KeyColumn varchar(64),
@ExclusionColumn varchar(64),
@ColumnList varchar(1024),
@UpdateColumnList varchar(8000),
@SourceColumnList varchar(8000),
@Statement nvarchar(max)
SET @SchemaName='dbo'
SET @TargetTableName='Target'
SET @SourceTableName='Source'
SET @KeyColumn='Position'
SET @ExclusionColumn='Created'
SELECT @ColumnList = STUFF((
select ',' + COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA=@SchemaName
and TABLE_NAME=@TableName
and COLUMNPROPERTY(OBJECT_ID(@SchemaName+'.'+@TableName),COLUMN_NAME,'isComputed')=0
FOR XML PATH ('')),1,1,'')
SELECT @UpdateColumnList = STUFF((
select ',' + COLUMN_NAME +'=source.'+COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA=@SchemaName
and TABLE_NAME=@TableName
and COLUMN_NAME not in (@ExclusionColumn,@KeyColumn)
and COLUMNPROPERTY(OBJECT_ID(@SchemaName+'.'+@TableName),COLUMN_NAME,'isComputed')=0 FOR XML PATH ('')),1,1,'')
SELECT @SourceColumnList = STUFF((
select ',' + 'source.'+COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA=@SchemaName
and TABLE_NAME=@TableName
and COLUMNPROPERTY(OBJECT_ID(@SchemaName+'.'+@TableName),COLUMN_NAME,'isComputed')=0 FOR XML PATH ('')),1,1,'')
SET @Statement = 'MERGE ' + @SchemaName + '.' + @TargetTableName + ' AS Target USING (SELECT ' +
@ColumnList + ' FROM '+ @SchemaName +'.' + @SourceTableName + ') AS source ' +
' ON (target.'+@KeyColumn+'= source.'+@KeyColumn+')' +
' WHEN MATCHED THEN UPDATE SET '+ @UpdateColumnList +
' WHEN NOT MATCHED THEN INSERT('+@ColumnList+')
VALUES ('+@SourceColumnList+');'
EXECUTE sp_executesql @Statement