首页 > 解决方案 > SSIS 中的 INSERT/UPDATE 条件拆分工作不正确

问题描述

在发布之前,我为我的特定问题寻找答案。什么也没找到。我在 SSIS 中有一个条件拆分,它正在插入和更新,除了它似乎每次运行时都会更新 250 多行,无论是否对源进行了更新。插入工作正常。但它仅在我在条件拆分上“忽略错误”时才有效,否则拆分“评估为 NULL,但“条件拆分”需要布尔结果“错误出现。关于如何解决这个问题的任何想法?我的条件拆分如下所示:

UPDATE = [Copy of ORDER_TYPE] != ORDER_TYPE || [Copy of WEEK] != WEEK || [Copy of GOAL] != GOAL || [Copy of WEEK_START] != WEEK_START || [Copy of WEEK_END] != WEEK_END || [Copy of DIVISION_DESC] != DIVISION_DESC || [Copy of SUB_ORDER_TYPE] != SUB_ORDER_TYPE
INSERT = ISNULL(ID) || ISNULL(WEEK) || ORDER_TYPE == ""

我按照教程进行操作。

标签: sql-serverssisconditional-statements

解决方案


在这种情况下,我们无法调试正在发生的事情,因为我们无法访问您的数据、您的包和上述布尔条件的结果。当遇到这样的问题时,我所做的是在条件拆分之前添加一个,可能是两个,派生列任务。第一个是我调用DER Action Flags的,因为我们将为我们应该采取的行动生成布尔条件。

添加一列IsInsertIsUpdate使用上述表达式。现在将您的派生列连接到条件拆分并替换两个表达式以仅使用我们的新派生列。在拆分之前添加一个数据查看器,您可以验证您的逻辑是否合理。

鉴于您的 UPDATE 表达式的长度,在DER Action Flags我上面描述之前,我会将其分解为派生列中的各个列评估。称它为DER Compute Changed Flags表示我们正在计算列是否已更改。

在这个派生列组件中,您将分解每个列更改检查,即

  • 已更改_ORDER_TYPE[Copy of ORDER_TYPE] != ORDER_TYPE
  • 已更改_WEEK[Copy of WEEK] != WEEK

IsUpdate然后将逻辑简化为Changed_ORDER_TYPE || Changed_WEEK...

现在,数据查看器将向您显示导致更改被错误标记的确切情况。这将问题归结为这两个输入,并且该表达式未按预期进行评估(这是我们可以弄清楚的)

根据您的“忽略错误”评论,我假设您有一个带有 NULL 比较的条件,引用的链接可能未涵盖该条件。

由于这是一系列转换为答案的评论,

那行得通。数据查看器显示我的输入列之一转换为浮点数,而表数据类型为 int,因此带小数的值与表中的值不同,因为它们被转换为 int。固定的。

未来的读者,请验证您的数据类型(双击组件中的连接线并选择 MetaData)是否一致,因为数据转换规则可能会以意想不到的方式让您感到惊讶。


推荐阅读