【问题标题】:SCD2 + Merge Statement + SQL ServerSCD2 + 合并语句 + SQL Server
【发布时间】:2011-02-08 04:59:38
【问题描述】:

我正在尝试使用 MERGE 语句来插入/更新 SCD2 类型的维度表

我的来源是要与 Dimension 表合并的 Table var。

我的 MERGE 语句抛出错误:

目标表 'DM.DATA_ERROR.ERROR_DIMENSION' 的 INSERT 语句不能同时出现 a 的一侧(主键,外键) FROM 子句时的关系 包含嵌套的 INSERT、UPDATE、 DELETE 或 MERGE 语句。成立 参考约束 'FK_ERROR_DIMENSION_to_AUDIT_CreatedBy'。

我的 MERGE 声明:

DECLARE @DATAERROROBJECT AS [ERROR_DIMENSION]

INSERT INTO DM.DATA_ERROR.ERROR_DIMENSION
SELECT  ERROR_CODE,
    DATA_STREAM_ID,
    [ERROR_SEVERITY],
    DATA_QUALITY_RATING,
    ERROR_LONG_DESCRIPTION,
    ERROR_DESCRIPTION,
    VALIDATION_RULE,
    ERROR_TYPE,
    ERROR_CLASS,
    VALID_FROM,
    VALID_TO,
    CURR_FLAG,
    CREATED_BY_AUDIT_SK,
    UPDATED_BY_AUDIT_SK

FROM (MERGE DM.DATA_ERROR.ERROR_DIMENSION ED USING @DATAERROROBJECT OBJ
     ON(ED.ERROR_CODE = OBJ.ERROR_CODE AND ED.DATA_STREAM_ID = OBJ.DATA_STREAM_ID)     WHEN NOT MATCHED THEN    INSERT VALUES(
         OBJ.ERROR_CODE
        ,OBJ.DATA_STREAM_ID
        ,OBJ.[ERROR_SEVERITY]
        ,OBJ.DATA_QUALITY_RATING
        ,OBJ.ERROR_LONG_DESCRIPTION
        ,OBJ.ERROR_DESCRIPTION
        ,OBJ.VALIDATION_RULE
        ,OBJ.ERROR_TYPE
        ,OBJ.ERROR_CLASS
        ,GETDATE()
        ,'9999-12-13'
        ,'Y'
        ,1
        ,1
        ) WHEN MATCHED AND ED.CURR_FLAG = 'Y'
             AND (      ED.[ERROR_SEVERITY] <> OBJ.[ERROR_SEVERITY]
                   OR   ED.[DATA_QUALITY_RATING] <> OBJ.[DATA_QUALITY_RATING]
                   OR   ED.[ERROR_LONG_DESCRIPTION] <> OBJ.[ERROR_LONG_DESCRIPTION]
                   OR   ED.[ERROR_DESCRIPTION] <> OBJ.[ERROR_DESCRIPTION]
                   OR   ED.[VALIDATION_RULE] <> OBJ.[VALIDATION_RULE]
                   OR   ED.[ERROR_TYPE] <> OBJ.[ERROR_TYPE]
                   OR   ED.[ERROR_CLASS] <> OBJ.[ERROR_CLASS] ) THEN UPDATE SET ED.CURR_FLAG = 'N', ED.VALID_TO = GETDATE()
        OUTPUT $ACTION ACTION_OUT, 
                           OBJ.ERROR_CODE ERROR_CODE,
                           OBJ.DATA_STREAM_ID DATA_STREAM_ID,
                           OBJ.[ERROR_SEVERITY] [ERROR_SEVERITY],
                           OBJ.DATA_QUALITY_RATING DATA_QUALITY_RATING,
                           OBJ.ERROR_LONG_DESCRIPTION ERROR_LONG_DESCRIPTION,
                           OBJ.ERROR_DESCRIPTION ERROR_DESCRIPTION,
                           OBJ.VALIDATION_RULE VALIDATION_RULE,
                           OBJ.ERROR_TYPE ERROR_TYPE,
                           OBJ.ERROR_CLASS ERROR_CLASS,
                           GETDATE() VALID_FROM,
                           '9999-12-31' VALID_TO,
                           'Y' CURR_FLAG,
                           555 CREATED_BY_AUDIT_SK,
                           555 UPDATED_BY_AUDIT_SK
                           ) AS MERGE_OUT WHERE MERGE_OUT.ACTION_OUT = 'UPDATE';

我做错了什么?

【问题讨论】:

    标签: sql-server merge scd2


    【解决方案1】:

    实际上问题是 SQL Server 中的一个已知错误。问题是使用带有 INSERT...SELECT 语法的 DML 语句的 OUTPUT 子句。解决方法是没有引用维度表的外键,或者将 MERGE... 的结果插入到临时表中,然后插入到实际的维度表中:

    http://connect.microsoft.com/SQLServer/feedback/details/435031/unable-to-perform-slowly-changing-dimension-updates-on-a-dimension-table-with-a-foreign-key

    【讨论】:

      【解决方案2】:

      我认为您的基本错误是您似乎期望 MERGE 正在返回一个数据集 - 就像 SELECT .... 那样 - 它确实不是

      我不相信你可以使用

      SELECT (list of fields)
      FROM (MERGE DM.DATA_ERROR.ERROR_DIMENSION ED 
            USING @DATAERROROBJECT OBJ
            ON(ED.ERROR_CODE = OBJ.ERROR_CODE AND ED.DATA_STREAM_ID = OBJ.DATA_STREAM_ID)
         .......
      

      你需要做的是:

      • 加载要合并到单独临时表中的数据
      • 然后将 MERGE 语句作为针对目标表的单独语句发出,使用该临时表作为源

      查看这些资源:

      【讨论】:

        猜你喜欢
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 2018-01-19
        • 1970-01-01
        相关资源
        最近更新 更多