小编ame*_*ame的帖子

生成差异的最有效方法

我在 SQL Server 中有一个表,如下所示:

Id    |Version  |Name    |date    |fieldA   |fieldB ..|fieldZ
1     |1        |Foo     |20120101|23       |       ..|25334123
2     |2        |Foo     |20120101|23       |NULL   ..|NULL
3     |2        |Bar     |20120303|24       |123......|NULL
4     |2        |Bee     |20120303|34       |-34......|NULL
Run Code Online (Sandbox Code Playgroud)

我正在研究一个存储过程来区分,它需要输入数据和版本号。输入数据包含从 Name up 到 fieldZ 的列。大多数字段列预计为NULL,即每行通常只有前几个字段的数据,其余为NULL。名称、日期和版本构成了表上的唯一约束。

对于给定的版本,我需要对输入的与该表相关的数据进行比较。每一行都需要区分——一行由名称、日期和版本标识,字段列中任何值的任何更改都需要显示在差异中。

更新:所有字段都不需要是十进制类型。其中一些可能是 nvarchars。我更希望 diff 发生而不转换类型,尽管 diff 输出可以将所有内容转换为 nvarchar,因为它仅用于显示目的。

假设输入如下,请求的版本为2,:

Name    |date    |fieldA   |fieldB|..|fieldZ
Foo     |20120101|25       |NULL  |.. |NULL
Foo     |20120102|26       |27    |.. |NULL
Bar     |20120303|24       |126   |.. |NULL
Baz     |20120101|15       |NULL  |.. |NULL
Run Code Online (Sandbox Code Playgroud)

差异需要采用以下格式:

name    |date    |field    |oldValue    |newValue
Foo     |20120101|FieldA …
Run Code Online (Sandbox Code Playgroud)

join sql-server union cross-apply

8
推荐指数
2
解决办法
224
查看次数

标签 统计

cross-apply ×1

join ×1

sql-server ×1

union ×1