跟踪MERGE命令及其OUTPUT的作用

时间:2009-07-29 01:28:32

标签: sql-server merge data-warehouse etl type-2-dimension

我正在使用以下(长)SQL语句修改Type 2维度:

INSERT INTO AtlasDataWarehouseReports.District
(
    Col01,
    Col02,
    Col03,
    Col04,
    Col05,
    Col06,
    Col07,
    Col08,
    Col09,
    Col10,
    StartDateTime,
    EndDateTime
)
SELECT
    Col01,
    Col02,
    Col03,
    Col04,
    Col05,
    Col06,
    Col07,
    Col08,
    Col09,
    Col10,
    CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101)) AS StartDateTime,
    NULL AS EndDateTime
FROM 
(
    MERGE AtlasDataWarehouseReports.District AS MergeTarget

    USING Staging.District as MergeSource
        ON MergeTarget.Col01 = MergeSource.Col01
        AND MergeTarget.EndDateTime IS NULL

    WHEN MATCHED 
        AND (
                MergeTarget.Col02 <> MergeSource.Col02
                OR MergeTarget.Col05 <> MergeSource.Col05
            )
    THEN
        UPDATE SET MergeTarget.EndDateTime = CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101))

    WHEN NOT MATCHED 
    THEN
        INSERT 
        (
            Col01,
            Col02,
            Col03,
            Col04,
            Col05,
            Col06,
            Col07,
            Col08,
            Col09,
            Col10,
            StartDateTime,
            EndDateTime
        )
        VALUES 
        (
            MergeSource.Col01,
            MergeSource.Col02,
            MergeSource.Col03,
            MergeSource.Col04,
            MergeSource.Col05,
            MergeSource.Col06,
            MergeSource.Col07,
            MergeSource.Col08,
            MergeSource.Col09,
            MergeSource.Col10,
            CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101)),
            NULL
        )
    OUTPUT $Action as MergeAction, MergeSource.*
) AS MergeOutput
WHERE 1=1
    AND MergeOutput.MergeAction = 'UPDATE';

我正在运行它作为加载我的数据仓库的ETL的一部分。我想要构建的是一个详细的日志记录系统,可以跟踪日志表/文件等中的所有更改。

在MERGE期间实际完成的所有工作和INSERT中使用的OUTPUT都在幕后。我想跟踪参与此查询的所有列和值。

我有什么方法可以捕获这些数据吗?

1 个答案:

答案 0 :(得分:1)

我认为在这里使用T-SQL MERGE语句的缺点是你会模糊实际发生的事情,因此引入日志记录可能需要重复工作。

只是我的想法,但你似乎在这里重新发明轮子。

SQL Server Integration Services(SSIS)为这些精确的处理要求提供了预构建的组件。

例如,您可以使用现有的Slowly Changing Dimension Transformation组件,也可以使用多个较低级别的组件来实现自己的自定义解决方案,但随后会合并日志记录。