如何在系统版本化的时态表中仅获取已修改的列。
我正在使用 SQL 2016 系统版本的时态表来跟踪更改。我的历史表填充了多行,其中包括每个版本的行编辑的修改和未修改的列。
有没有办法从历史行数据中只获取修改后的列值。
感谢您的回复。
谢谢
阿卜杜勒
如何在系统版本化的时态表中仅获取已修改的列。
我正在使用 SQL 2016 系统版本的时态表来跟踪更改。我的历史表填充了多行,其中包括每个版本的行编辑的修改和未修改的列。
有没有办法从历史行数据中只获取修改后的列值。
感谢您的回复。
谢谢
阿卜杜勒
我使用这种方法来解决问题。
获取所有历史记录和交易记录,并使用主键进行分区。
交叉应用表以使行结构为列名和列值,当然还有其他 ID,如主键、分区键等
根据列名、主键和分区键比较列值
请让我知道是否有任何好的方法。
问候
阿卜杜勒
感谢@Abdul Azeez的描述,这里是实现这个目标的示例代码:
假设我有一个名为 的表MyTable
,并且我想一直捕获对Name
和LastName
列(两者都有 varchar 数据类型)的更改。
;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
);
注意:如果列具有不同的数据类型,您可能需要将它们转换为适当的数据类型。