这是可能的,但不是我害怕的内置方式。您将不得不手动重建时间线。
鉴于更改跟踪表提供 tran_end_time,即属性值应被视为持久的时间,您必须进行查询以获取表状态的所有不同时期,加入跟踪的属性更改然后旋转(以与表格相同的形式进行演示)。不要忘记与表状态本身联合以获取尚未更改/跟踪的值以确保完整性。
简化后的最终结果应如下所示
RN PK PropA PropB FromDate ToDate
1 1 'Ver1' 'Ver1' 2012-01-01 09:00 2012-01-02 08:00
2 1 'Ver1' 'Ver2' 2012-01-02 08:00 2012-01-03 07:00
3 1 'Ver2' 'Ver2' 2012-01-03 07:00 *getdate()*
4 2 'Ver1' 'Ver1' 2012-01-01 05:00 2012-01-02 06:00
5 2 'Ver1' 'Ver2' 2012-01-02 06:00 2012-01-03 01:00
6 2 'Ver2' 'Ver2' 2012-01-03 01:00 *getdate()*
请注意,如果未删除该行,则getdate()有效,在这种情况下,应将其替换为删除日期
编辑,用于 2 个用例。第一点很容易解决,它是构建时间对象图然后过滤的问题:
declare @pointInTime datetime = '20120102 10:00';
select * from Reconstructed_TG where FromDate <= @pointInTime and @pointInTime < ToDate
正如您所指出的,第二点可以使用 EXCEPT 子句轻松生成。鉴于上述查询:
declare @pointInTimeA datetime = '20120102 10:00';
declare @pointInTimeB datetime = '20120103 01:00';
select * from Reconstructed_TG where FromDate <= @pointInTimeA and @pointInTimeA < ToDate
EXCEPT
select * from Reconstructed_TG where FromDate <= @pointInTimeB and @pointInTimeB < ToDate
但是该except
子句仅显示具有至少一个不同列值的行;我不知道这些信息对人眼是否真的有意义。根据您的需要,直接处理cdc
数据的查询可能更合适。