SQL Server 2019:批量更新TableB与TableA同名同类型列(带过滤)
快速生成SQL Server跨表更新脚本(匹配同名列)
针对SQL Server 2019中TableA和TableB(列名、数据类型完全一致)的批量更新需求,无需手动编写100列的SET语句,可通过系统视图自动生成符合要求的更新脚本:
自动生成脚本的SQL语句
DECLARE @TableNameA NVARCHAR(128) = 'TableA'; DECLARE @TableNameB NVARCHAR(128) = 'TableB'; DECLARE @JoinColumn NVARCHAR(128) = 'id'; DECLARE @FilterCondition NVARCHAR(MAX) = 'TableA.ModifiedOn > DATEADD(day, -1, GETDATE())'; -- 生成SET子句:自动匹配两表同名列(排除关联列) DECLARE @SetClause NVARCHAR(MAX); SELECT @SetClause = STRING_AGG(QUOTENAME(c.name) + ' = ' + QUOTENAME(@TableNameA) + '.' + QUOTENAME(c.name), ', ') FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE t.name = @TableNameA AND c.name != @JoinColumn AND EXISTS ( SELECT 1 FROM sys.columns c2 JOIN sys.tables t2 ON c2.object_id = t2.object_id WHERE t2.name = @TableNameB AND c2.name = c.name AND c2.system_type_id = c.system_type_id -- 确保数据类型一致 ); -- 拼接完整UPDATE语句 DECLARE @UpdateScript NVARCHAR(MAX); SET @UpdateScript = 'UPDATE ' + QUOTENAME(@TableNameB) + ' SET ' + @SetClause + ' FROM ' + QUOTENAME(@TableNameB) + ' JOIN ' + QUOTENAME(@TableNameA) + ' ON ' + QUOTENAME(@TableNameB) + '.' + QUOTENAME(@JoinColumn) + ' = ' + QUOTENAME(@TableNameA) + '.' + QUOTENAME(@JoinColumn) + ' WHERE ' + @FilterCondition; -- 输出最终脚本 PRINT @UpdateScript;
使用说明
- 替换变量
@TableNameA、@TableNameB为实际表名 - 确认
@JoinColumn是两表的关联主键(此处为id) @FilterCondition可根据需求调整过滤逻辑(当前为近1天修改的数据)- 执行该SQL后,会在消息窗口打印出完整的UPDATE脚本,包含所有同名列的SET赋值语句
内容的提问来源于stack exchange,提问作者Muhid
相关产品推荐
相关产品推荐

