2010-04-15 91 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