Sql 2016 - 如何在系统版本时间中只获取修改过的列 table
Sql 2016 - How to get only modified column in system-versioned temporal table
如何在系统版本化的时间中仅获取修改的列 table。
我正在使用 SQL 2016 系统版本临时 table 来跟踪更改。我有历史 table 填充了多行,其中包括每个版本的行编辑的已修改和未修改的列。
有没有办法只从历史行数据中获取修改后的列值。
感谢您的回复。
谢谢
阿卜杜勒
我用这个方法解决了问题。
获取所有历史和交易记录并使用主键进行分区。
交叉应用 table 使行结构为列名和列值,当然还有其他 ID,如主键、分区键等
根据列名、主键和分区键比较列值
有什么好的方法请告诉我
此致
阿卜杜勒
感谢的描述,这里是实现这个目标的示例代码:
假设我有一个名为 MyTable
的 table,我想捕获 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
);
注意:如果列具有不同的数据类型,您可能需要将它们转换为适当的数据类型。
如何在系统版本化的时间中仅获取修改的列 table。
我正在使用 SQL 2016 系统版本临时 table 来跟踪更改。我有历史 table 填充了多行,其中包括每个版本的行编辑的已修改和未修改的列。
有没有办法只从历史行数据中获取修改后的列值。
感谢您的回复。
谢谢
阿卜杜勒
我用这个方法解决了问题。
获取所有历史和交易记录并使用主键进行分区。
交叉应用 table 使行结构为列名和列值,当然还有其他 ID,如主键、分区键等
根据列名、主键和分区键比较列值
有什么好的方法请告诉我
此致
阿卜杜勒
感谢
假设我有一个名为 MyTable
的 table,我想捕获 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
);
注意:如果列具有不同的数据类型,您可能需要将它们转换为适当的数据类型。