Инкрементная загрузка в T-SQL с записанной историей

Пожалуйста, помогите мне, мне нужно сделать инкрементный процесс для моих измерений, чтобы также хранить данные истории с помощью T-SQL. Я пытаюсь использовать MERGE оператор, но это не работает, потому что этот процесс удаляет данные, которые существуют в целевой, но не в исходной таблице.

У кого-нибудь есть предложение?

Например, у меня есть исходная таблица: исходная таблица - это мой STAGE,
Состояние дескриптора трески
AAA Desc1 MI
BBB Desc 2 TX
CCC Desc 3 MA
При первой загрузке мое измерение будет равно STAGE

Однако я могу изменить значение в исходной таблице для примера

AAA ИЗМЕНЕНОПИСАНИЕ Mi

Итак, мне нужно обновить мое измерение следующим образом:
Состояние дескриптора трески
ААА Desc1 Mi раньше
AAA ИЗМЕНЕНО ОПИСАНИЕ MI актуально
BBB Desc 2 TX актуально
CCC Desc 3 MA актуальный
Это мой DW и мне нужна актуальная информация и вся история

2 ответа

Попробуй это. колонка Aging всегда равно "0" для текущей записи и указывает на генерацию изменений:

SELECT * INTO tbl_Target FROM (VALUES
('AAA','Desc1','MI',0),('BBB','Desc 2','TX',0),('CCC','Desc 3','MA',0)) as X(Cod, Descript, State, Aging);
GO
SELECT * INTO tbl_Staging FROM (VALUES ('AAA','Desc4','MI')) as X(Cod, Descript, State);
GO
UPDATE t SET Aging += 1
FROM tbl_Target as t
INNER JOIN tbl_Staging as s on t.Cod = s.Cod;
GO
INSERT INTO tbl_Target(Cod, Descript, State, Aging)
SELECT Cod, Descript, State, 0
FROM tbl_Staging;
GO
SELECT * FROM tbl_Target;

Обратите внимание, что если у вас есть записи в промежуточной таблице, которые "неизменны", вы получите ложные изменения. Если это так, вы должны отфильтровать их в обоих запросах.

Я только что прокомментировал пункт УДАЛИТЬ... Скажите, что вы думаете, пожалуйста

        MERGE DimTarget AS [Target] --— begin merge statements (merge statements end with a semi-colon)
        USING TableSource AS [Source]
        ON [Target].ID = [Source].ID AND [Target].[IsCurrentRow] = 1
        WHEN MATCHED AND --— record exists but values are different
        (
                [Target].Dscript <> [Source].Descript
            )
        THEN UPDATE SET --— update records (Type 1 means record values are overwritten)
              [Target].[IsCurrentRow] = 0
             -- , [Target].[ValidTo] = GETDATE()
        WHEN NOT MATCHED BY TARGET --— record does not exist
        THEN INSERT --— insert record
        (
            Descritp
        , [IsCurrentRow]
        )
        VALUES
        (
        Descript
        , 1
        )
       --WHEN NOT MATCHED BY SOURCE --— record exists in target but not source
       --THEN DELETE -- delete from target
        OUTPUT $action AS Action, [Source].* --— output results
Другие вопросы по тегам