3

如何在系统版本化的时态表中仅获取已修改的列。

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

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

感谢您的回复。

谢谢

阿卜杜勒

4

2 回答 2

1

我使用这种方法来解决问题。

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

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

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

请让我知道是否有任何好的方法。

问候
阿卜杜勒

于 2018-05-15T21:02:33.057 回答
0

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

假设我有一个名为 的表MyTable,并且我想一直捕获对NameLastName列(两者都有 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
);

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

于 2020-02-18T11:11:06.590 回答