Sql 2016 - 如何仅在系统版本的时态表中获取已修改的列

时间:2018-01-15 22:28:00

标签: sql sql-server-2016 temporal-tables

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

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

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

赞赏你的回复。

谢谢

阿都

2 个答案:

答案 0 :(得分:1)

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

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

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

  3. 根据列名,主键和分区键

  4. 比较列值

    如果有任何好的方法,请告诉我。

    问候
    阿都

答案 1 :(得分:0)

感谢@Abdul Azeez的描述,下面是实现此目标的示例代码:

假设我有一个名为MyTable的表,并且我想捕获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
);

注意::如果这些列具有不同的数据类型,则可能需要将其强制转换为适当的数据类型。