-4

请帮助我,我需要对我的维度进行增量处理,以便通过T-SQL存储历史数据。我尝试使用MERGE语句,但它不起作用,因为此过程会删除目标中但不在源表中存在的数据。有记录历史的T-SQL的增量负载

有人有建议吗?

对于为例我源表:源表是我的阶段,
鳕DESCRIPT国家
AAA DESC1 MI
BBB说明2 TX
CCC说明3 MA
在第一负载我的尺寸将等于STAGE

但是我可以在源表改变值为例

AAA CHANGEDESCRIPTION祢

所以,我需要更新我的尺寸是这样的:
科德DESCRIPT国家
AAA DESC1宓前
AAA CHANGEDESCRIPTION MI实际
BBB说明2 TX实际
CCC说明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 我试图忽视的问题删除句子在这样的合并...... WHEN NOT MATCHED BY SOURCE 然后删除 我评论的clausule WHEN NOT MATCHED BY SOURCE,现在它的OK 你觉得这个怎么样的解决方案?这很好? – twister8

+0

请将您的代码作为答案发布。您必须在100%的时间内执行“插入”操作,但在匹配的情况下,您还必须执行“UPDATE”。我没有看到你如何使用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