2010-04-15 101 views
0

我试图制定出与MERGE statment到插入式SCD2的/更新维度表SCD2 + MERGE语句+ SQL服务器

我的源是表VAR与维度表合并。

我的MERGE语句是抛出一个错误:

目标表 的 INSERT语句的“DM.DATA_ERROR.ERROR_DIMENSION”不能在任 侧(主键,外键) 当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'; 

我在做什么错?

回答

0

我认为你的根本错误是,你似乎期待MERGE返回一个数据集 - 比如SELECT .... does - 它确实是而不是

我不相信你可以使用

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声明作为针对目标表的单独声明,使用该临时表作为源

看看这些资源:

16

其实这个问题是在SQL Server中的一个已知的bug。问题是使用INSERT ... SELECT语法的DML语句的OUTPUT子句。解决方法是要么没有外键引用维度表或插入合并的结果...输出到一个临时表,然后插入到实际维度表:

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

+0

我解决了这个问题对我来说使用#Temp表格 – 2015-02-18 17:51:50