记录历史的 T-SQL 中的增量负载

Posted

技术标签:

【中文标题】记录历史的 T-SQL 中的增量负载【英文标题】:Incremental load in T-SQL with recorded history 【发布时间】:2016-08-03 16:23:54 【问题描述】:

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

有人有什么建议吗?

例如我有源表:源表是我的 STAGE, 代码描述状态 AAA Desc1 MI BBB Desc 2 TX CCC Desc 3 MA 在第一次加载时,我的维度将等于 STAGE

但是我可以更改源表中的值,例如

AAA CHANGEDECRIPTION Mi

所以,我需要像这样更新我的维度: 代码描述状态 AAA Desc1 Mi before AAA CHANGEDECRIPTION MI 实际 BBB Desc 2 TX 实际 CCC Desc 3 MA 实际 这是我的 DW,我需要实际信息和所有历史记录

【问题讨论】:

请展示一些示例数据和预期结果 我用例子更新了问题 【参考方案1】:

试试这个。对于当前记录,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;

请注意,如果暂存表中有“未更改”的记录,您将得到错误的更改。如果是这样,您必须在两个查询中过滤掉它们。

【讨论】:

Tks for anwser 我试着像这样忽略合并中的 DELETE 语句...当源不匹配时删除我评论了源不匹配时的分句,现在可以了 你对此有何看法解决方案?好用吗? 请发布您的代码作为答案。您必须在 100% 的时间内执行 Insert,但如果匹配,您还必须执行 UPDATE。我看不出您如何将MERGE 用于该特定解决方案。【参考方案2】:

我刚刚评论了删除条款...请告诉我你的想法

        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

【讨论】:

以上是关于记录历史的 T-SQL 中的增量负载的主要内容,如果未能解决你的问题,请参考以下文章

如何查询历史sql

C语言有前置增量和后置增量的历史原因是啥?

sar命令查看历史数据

SCD 类型 2 的 T-SQL 语法

T-SQL 之 触发器

反正有保存推送通知吗?