2010-04-15 4 views
0

을 병합합니다.SCD2 + 내가</p> <p>내 소스는 차원 테이블과 병합 할 수있는 테이블 VAR은/업데이트 치수 표 형식 SCD2의 삽입하는 MERGE의 한 Statment와 함께 작업을 시도하고 문 + SQL 서버

내 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 ...와 같은 데이터 집합을 반환한다고 기대하는 것 같습니다 - 이 아닙니다.

난 당신이해야 할 일은

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) 
    ....... 

를 사용할 수 있다고 생각하지 않는 것은 : 별도의 준비 테이블에 병합 될

  • 당신의 데이터를로드하는 것은
  • 다음 병합을 실행 문을 대상 테이블에 대한 별도의 명령문으로 사용하여 해당 스테이징 테이블을 소스로 사용하십시오.

이러한 자원을 체크 아웃 :

16

사실이 문제는 SQL Server의 알려진 버그입니다. 문제는 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 테이블 사용 –