SSIS Equality Operator未按预期工作

时间:2013-04-03 13:56:48

标签: mysql ssis

我有一个连接到MySQL数据库的SSIS包,该数据库的tinyint(1)字段设置为值4,我正在检查该值是否为{{1}在数据库中,因为它不应该根据传入的平面文件进行更改,如果它已经设置为4,但它似乎不起作用。

它不应该更新状态,因为该字段设置为4但我想我只是不明白为什么表达式不起作用。我已经为SSIS尝试了所有不同的4类型,这无关紧要,因为它始终将状态设置为int。基于快速谷歌搜索,1应为tinyint,这就是我将其投射到unsigned 1 byte int

的原因

来自平面文件的传入值,第一个是产品,最后一个是状态

DT_UI1

数据库中的现有值第一个是产品,第二个是状态

"039414","*****","*****","*****","*****","*****","*****","*****"," "

我通过以下派生列表达式处理状态,基本上如果没有值,它应该是039414 4 ,否则它应该是1

4

这是我用来设置product_status的派生列表达式(products_status是数据库中的实际字段,prod_status是来自传入平面文件的状态):

LEN(TRIM(Status)) > 0 ? (DT_UI1)4 : (DT_UI1)1

我期待发生的事情是,有些产品应该保持((DT_UI1)products_status == (DT_UI1)4) || ISNULL(prod_status) ? (DT_UI1)4 : (DT_UI1)prod_status 的状态,但会更新为4,是否有人知道为什么?

修改

我尝试将表达式更改为以下内容但没有成功。

1

(DT_UI1)products_status == (DT_UI1)4 || ISNULL(prod_status) ? (DT_UI1)4 : (DT_UI1)prod_status

只是基础测试

((DT_UI1)products_status == (DT_UI1)4 || ISNULL(prod_status)) ? (DT_UI1)4 : (DT_UI1)prod_status

解决方案:

我最终将查询中的字段转换为整数,因为它是以(DT_UI1)products_status == (DT_UI1)4 ? (DT_UI1)4 : (DT_UI1)prod_status 而不是boolean

引入的
int

然后将我的表达式更改为以下内容并按预期工作

CAST(products_status AS SIGNED)

2 个答案:

答案 0 :(得分:1)

不确定这里的优先顺序,但是你不认为你想要立即围绕条件的额外括号:

( ((DT_UI1)products_status == (DT_UI1)4) || ISNULL(prod_status) ) ? (DT_UI1)4 : (DT_UI1)prod_status

看起来它可能会返回“true”,有时会呈现为1。

更新

以下是Data Viewer的链接,可让您查看SSIS分配给列的值,并帮助您分析此类情况。

答案 1 :(得分:1)

你原来的表达

((DT_UI1)products_status == (DT_UI1)4) || ISNULL(prod_status) ? (DT_UI1)4 : (DT_UI1)prod_status

返回一个布尔值。假设products_status为4,prod_status也设置为4。

((DT_UI1)products_status == (DT_UI1)4) 

评估为真。

ISNULL(prod_status) ? (DT_UI1)4 : (DT_UI1)prod_status

评估为4。

您的原始表达式现在评估为

TRUE || 4

评估为

TRUE

当你尝试将它粘贴在像products_status这样的整数列中时会变为1。

您的第一次修订不会对评估链做出实质性更改,也会返回TRUE(即1)。

您的第二次修订是三元运算符的正确表达,最终的基本测试也是如此。但是,似乎ISNULL(prod_status)总是在你的情况下返回FALSE,因为你在其他派生列中明确地将它设置为4或1,所以让我们忽略你的第二个版本,然后进入你的最终基础测试。

关于你的最终基础测试,我肯定会:

  • 在派生列组件之前附加数据查看器,以确保传入的products_status列确实设置为4
  • 在派生列组件后设置数据查看器,以查看products_status是否已正确设置(或未设置);
  • 确保您将products_status字段正确映射到数据库目标,而不是错误地映射到prod_status字段。