Sql 2016 - Как получить только измененный столбец в темпоральной таблице с системной версией

Как получить только измененный столбец во временной версии системы.

Я использую системную версию SQL 2016 для отслеживания изменений. У меня есть таблица истории, заполненная несколькими строками, которые содержат измененные и неизмененные столбцы для каждой версии редактирования строки.

Есть ли способ получить только измененное значение столбца из данных строки истории.

Ценю ваш ответ.

Спасибо

Абдул

1 ответ

Решение

Я использовал этот подход для решения проблемы.

  1. Получить все истории и транзакций и записей с первичным ключом.

  2. Перекрестная таблица Примените таблицу, чтобы сделать структуру строки с именем столбца и значением столбца и, конечно, с другими идентификаторами, такими как первичный ключ, секционированный ключ и т. Д

  3. Сравнить значение столбца на основе имени столбца, первичного ключа и ключа раздела

Пожалуйста, дайте мне знать, если какой-либо хороший подход.

С уважением Абдул

Благодаря описанию @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
);

Примечание. Если столбцы имеют разные типы данных, вам может потребоваться привести их к соответствующему типу данных.

Другие вопросы по тегам