SQL Server多版本表记录差异对比SQL脚本开发需求
SQL Server 同维度版本差异对比脚本
以下是满足需求的SQL脚本,可针对同一ParentItem+ChildItem组合下的版本0(旧版)和版本1(新版)记录,对比Color、PG#列的差异,并输出指定格式结果:
WITH VersionPairs AS ( -- 关联同维度下的版本0和版本1记录 SELECT t1.ParentItem, t1.ChildItem, t1.Version, t0.Color AS Old_Color, t1.Color AS New_Color, t0.[PG#] AS Old_PG, t1.[PG#] AS New_PG FROM YourTable t0 INNER JOIN YourTable t1 ON t0.ParentItem = t1.ParentItem AND t0.ChildItem = t1.ChildItem AND t0.Version = 0 AND t1.Version = 1 ) -- 列转行并处理差异展示逻辑 SELECT ParentItem, ChildItem, Version, ColumnName, CASE WHEN Old_Value = New_Value THEN NULL ELSE Old_Value END AS OldValue, CASE WHEN Old_Value = New_Value THEN NULL ELSE New_Value END AS NewValue FROM VersionPairs CROSS APPLY ( -- 将需要对比的列拆分为行记录 VALUES ('Color', CAST(Old_Color AS VARCHAR(MAX)), CAST(New_Color AS VARCHAR(MAX))), ('PG#', CAST(Old_PG AS VARCHAR(MAX)), CAST(New_PG AS VARCHAR(MAX))) ) AS Unpivoted(ColumnName, Old_Value, New_Value);
逻辑说明
- CTE
VersionPairs:通过ParentItem和ChildItem关联旧版(Version=0)和新版(Version=1)的记录,提取出目标列的新旧值。 CROSS APPLY + VALUES:将列数据转换为行数据,让每一列的对比结果单独成为一行,匹配期望的输出结构。- 差异判断:用
CASE语句判断新旧值是否一致,一致时将OldValue和NewValue设为NULL,不一致则保留对应值。 - 类型统一:通过
CAST将不同数据类型的列(如数值型的PG#、字符串型的Color)统一转换为字符串,确保输出列类型一致。
使用注意
- 替换脚本中的
YourTable为实际数据表名。 - 若需扩展对比更多列,只需在
CROSS APPLY的VALUES块中添加新行,格式为('列名', 旧值列, 新值列)。
内容的提问来源于stack exchange,提问作者user987372
相关产品推荐
相关产品推荐

