Sql 2016 - 如何在系统版本时间中只获取修改过的列 table

Sql 2016 - How to get only modified column in system-versioned temporal table

如何在系统版本化的时间中仅获取修改的列 table。

我正在使用 SQL 2016 系统版本临时 table 来跟踪更改。我有历史 table 填充了多行,其中包括每个版本的行编辑的已修改和未修改的列。

有没有办法只从历史行数据中获取修改后的列值。

感谢您的回复。

谢谢

阿卜杜勒

我用这个方法解决了问题。

  1. 获取所有历史和交易记录并使用主键进行分区。

  2. 交叉应用 table 使行结构为列名和列值,当然还有其他 ID,如主键、分区键等

  3. 根据列名、主键和分区键比较列值

有什么好的方法请告诉我

此致
阿卜杜勒

感谢的描述,这里是实现这个目标的示例代码:

假设我有一个名为 MyTable 的 table,我想捕获 NameLastName 列(均具有 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
);

注意:如果列具有不同的数据类型,您可能需要将它们转换为适当的数据类型。