0

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

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

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

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

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

039414  4

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

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

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

((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

解决方案:

我最终将查询中的字段转换为整数,因为它被作为 aboolean而不是int

CAST(products_status AS SIGNED)

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

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

2 回答 2

1

不确定这里的优先级,但你不认为你想要在立即条件周围加上额外的括号,如果:

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

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

更新

这是指向数据查看器的链接,可让您查看 SSIS 分配给列的值并帮助您分析此类情况。

于 2013-04-03T14:08:07.307 回答
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) 

评估为 TRUE。

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 字段映射。
于 2013-04-03T14:53:46.477 回答