Инкрементная загрузка в 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