Sql 2016 - Как получить только измененный столбец в темпоральной таблице с системной версией
Как получить только измененный столбец во временной версии системы.
Я использую системную версию SQL 2016 для отслеживания изменений. У меня есть таблица истории, заполненная несколькими строками, которые содержат измененные и неизмененные столбцы для каждой версии редактирования строки.
Есть ли способ получить только измененное значение столбца из данных строки истории.
Ценю ваш ответ.
Спасибо
Абдул
1 ответ
Я использовал этот подход для решения проблемы.
Получить все истории и транзакций и записей с первичным ключом.
Перекрестная таблица Примените таблицу, чтобы сделать структуру строки с именем столбца и значением столбца и, конечно, с другими идентификаторами, такими как первичный ключ, секционированный ключ и т. Д
Сравнить значение столбца на основе имени столбца, первичного ключа и ключа раздела
Пожалуйста, дайте мне знать, если какой-либо хороший подход.
С уважением Абдул
Благодаря описанию @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
);
Примечание. Если столбцы имеют разные типы данных, вам может потребоваться привести их к соответствующему типу данных.