【问题标题】:Can we Update all columns excluding one column in SQL?我们可以更新 SQL 中除一列之外的所有列吗?
【发布时间】:2020-09-10 11:50:32
【问题描述】:

我尝试了下面的代码,但它不起作用。

MERGE INTO Target as t
USING Source as s
ON s.Position = t.Position
WHEN MATCHED THEN
  UPDATE SET * [except Created]
WHEN NOT MATCHED
  THEN INSERT *

【问题讨论】:

  • 不,不支持此语法。您需要列出列。
  • 不支持这种语法,但您可以使用动态 SQL 通过从 information_schema.columns 表中创建列列表来实现类似的目的。
  • 取决于您的好处/问题,您可以使用触发器阻止/撤销列的更新。

标签: sql sql-server sql-merge


【解决方案1】:

假设您在两个表中具有相同的列名,这样应该可以:

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

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 2012-10-19
    • 1970-01-01
    • 2013-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多