我有一个连接到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)
答案 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,所以让我们忽略你的第二个版本,然后进入你的最终基础测试。
关于你的最终基础测试,我肯定会: