我有一个SSIS包,它连接到一个MySQL数据库中,该数据库的tinyint(1)字段设置为值4,我正在检查该值在数据库中是否是4,因为如果传入的平面文件已经设置为4,那么它不应该根据传入的平面文件进行更改,但它似乎不起作用。
它不应该更新状态,因为字段设置为4,但我想我只是不明白为什么表达式不能工作。我已经为SSIS尝试了所有不同的int类型,这并不重要,因为它总是将状态设置为1。基于快速的google搜索,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解决方案:
最后,我将查询中的字段转换为整数,因为它是以boolean而不是int的形式引入的。
CAST(products_status AS SIGNED)然后将我的表达式更改为下面的表达式,它按预期工作。
(products_status == 4 || ISNULL(prod_status)) ? (DT_I4)4 : prod_status发布于 2013-04-03 14:08:07
这里不确定优先级,但您不认为在以下情况下,需要在条件周围加上额外的括号:
( ((DT_UI1)products_status == (DT_UI1)4) || ISNULL(prod_status) ) ? (DT_UI1)4 : (DT_UI1)prod_status看起来它可能会返回"true",有时被呈现为1。
更新
这里有一个指向数据查看器的链接,它允许您查看SSIS分配给列的值,并帮助您分析类似的情况。
发布于 2013-04-03 14:53:46
你原来的表情
((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,所以让我们忽略您的第二次修订,只需进行最后的基本测试。
关于你最后的基础测试,我肯定会:
https://stackoverflow.com/questions/15789400
复制相似问题