如何在系统版本的时态表中仅获取修改后的列。
我正在使用SQL 2016系统版本的时态表来跟踪更改。我在历史表中填充了多行,其中包括每行版本的修改和未修改的列。
有没有办法只从历史行数据中获取修改后的列值。
赞赏你的回复。
谢谢
阿都
答案 0 :(得分:1)
我用这种方法来解决问题。
获取所有历史记录和交易记录,并使用主键分区。
交叉应用表格以使行结构为列名称和列值,当然还有其他ID,如主键,分区键等
根据列名,主键和分区键
如果有任何好的方法,请告诉我。
问候
阿都
答案 1 :(得分:0)
感谢@Abdul Azeez的描述,下面是实现此目标的示例代码:
假设我有一个名为MyTable
的表,并且我想捕获Name
和LastName
列(都具有varchar数据类型)上的更改 FOR ALL 时间很长。
;WITH T
AS (
SELECT ID,
LAG(Name) OVER (PARTITION BY ID ORDER BY SysStartTime, SysEndTime) AS Prev_Name,
Name,
LAG(LastName) OVER (PARTITION BY ID ORDER BY SysStartTime, SysEndTime) AS Prev_LastName,
LastName,
Email,
SysStartTime,
SysEndTime
FROM dbo.MyTable FOR SYSTEM_TIME ALL
WHERE Email = 'myEmail@somewhere.com'
)
SELECT T.SysStartTime,
T.SysEndTime,
C.ColName,
C.prev_value,
C.cur_value
FROM T
CROSS APPLY
(
VALUES
('Name', T.Name, T.Prev_Name),
('LastName', T.LastName, T.Prev_LastName)
) AS C (ColName, cur_value, prev_value)
WHERE EXISTS
(
SELECT cur_value
EXCEPT
SELECT C.prev_value
);
注意::如果这些列具有不同的数据类型,则可能需要将其强制转换为适当的数据类型。