首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SCD2 + Merge语句+ Server

SCD2 + Merge语句+ Server
EN

Stack Overflow用户
提问于 2010-04-15 03:15:41
回答 2查看 5.8K关注 0票数 3

我正在尝试使用合并状态来插入/更新SCD2类型的维度表

我的源是一个要与维度表合并的表var。

我的合并语句正在抛出一个错误,如下所示:

当FROM子句包含嵌套的INSERT、UPDATE、DELETE或MERGE语句时,INSERT语句的目标表“DM.DATA_ERROR.ERROR_DIMENSION”不能位于(主键、外键)关系的任何一方。找到引用约束‘FK_ERROR_维度_to_AUDIT_CreatedBy’。

我的合并声明:

代码语言:javascript
复制
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';

我做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-15 05:15:49

我认为您的基本错误是,您似乎预期合并将返回一个数据集,例如SELECT .是的-不是的。

我不相信你能用

代码语言:javascript
复制
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)
   .......

你需要做的是:

  • 加载要合并到单独的暂存表中的数据
  • 然后,使用暂存表作为源,对目标表发出一个合并语句作为单独的语句。

查看这些资源:

  • 使用Server 2008合并语句
  • Server 2008:合并介绍
票数 0
EN

Stack Overflow用户

发布于 2010-12-02 16:11:39

实际上,这个问题是Server中已知的一个错误。问题是使用DML语句的输出子句和INSERT.选择语法。解决方法是要么不让外键引用维度表,要么插入合并的结果.输出到临时表中,然后插入实际维度表中:

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

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2642504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档