-4

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

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

Для Exemple У меня есть таблица источника: таблица источника мой ЭТАП,
Cod Descript государственного
AAA DESC1 MI
BBB Desc 2 TX
CCC Desc 3 MA
В первой загрузке моего размера будет равным ЭТАП

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

AAA CHANGEDESCRIPTION Mi

Итак, мне нужно обновить свой размер, как это:
Cod Descript государственный
AAA DESC1 Ми до того
AAA CHANGEDESCRIPTION MI Фактическое
BBB Desc 2 TX фактическая
CCC Desc 3 MA фактическое
Это мой DW и мне нужна информация актуальная и вся история

+0

пожалуйста показать некоторые выборочные данные и ожидаемые результаты – TheGameiswar

+0

я обновил вопрос с примером – twister8

ответ

0

Попробуйте это. Колонка 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; 

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

+0

ТКС для anwser я пытался игнорировать УДАЛЕНИЕ предложения в слиянии, как это ... КОГДА НЕ Немаловажно ИСТОЧНИК ТОГДА УДАЛИТЬ Я прокомментировал clausule КОГДА НЕ Немаловажен ИСТОЧНИК, теперь его OK Что вы думаете об этом решении? хорошо? – twister8

+0

Пожалуйста, разместите свой код в качестве ответа. Вы должны «вставлять» 100% времени, но в случае соответствия вам также нужно выполнить «ОБНОВЛЕНИЕ». Я не вижу, как вы можете использовать 'MERGE' для этого конкретного решения. –

0

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

 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 
Смежные вопросы