2013-04-03 19 views
0

我有一個SSIS包掛鉤到一個具有tinyint(1)字段的值爲4的MySQL數據庫中,我檢查數據庫中該值是否爲4,因爲如果已經設置爲4,它不應該根據傳入的平面文件進行更改,但似乎不起作用。SSIS平等運營商不按預期工作

它不應該更新狀態,因爲該字段設置爲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 

解決方案:

我結束了鑄造查詢字段爲整數,因爲它是被拉入作爲boolean ins的int

CAST(products_status AS SIGNED) 

TEAD然後改變了我的表情下面,它的工作如預期

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

回答

1

不知道對這裏的優先級,但你不覺得你想周圍的狀況額外的括號在眼前,如果:

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

看起來似乎否則返回「真」,有時呈現爲1

UPDATE

這裏是Data Viewer一個鏈接,可以讓你看到什麼樣的價值觀SSIS是分配給列並幫助您分析這樣的情況。

+0

我試着去掉了所有除了鑄造括號但沒有用,我試着去除了除了鑄造括號之外的所有東西,還有一個額外的設置圍繞整個語句,並且無濟於事。 – Charles380

+0

我跟着一些鏈接,並同意:tinyint應該是DT_UI1。似乎在包變量下拉菜單中被稱爲「Byte」。我不確定它爲什麼不匹配(DT_UI1)4。 (您可以省略來自products_status的強制轉換?)我會在派生列步驟輸出的輸出上放置一個Data Viewer,並查看它認爲所有列值是什麼。 – criticalfix

+0

這裏有一個[DataViewer的鏈接](http://msdn.microsoft.com/en-us/library/ms140318.aspx) – criticalfix

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,所以讓我們忽略你的第二個修訂,然後轉到最終的基本測試。

至於最終基礎測試,我肯定會:

  • 您的派生列組件之前,請安裝一個數據瀏覽器,以確保在確實設置爲4
  • 設置一個傳遞的products_status列在派生列組件之後的數據查看器查看已正確設置(或未設置)的products_status;
  • 確保您正確地將products_status字段映射到數據庫目標,而不是錯誤地將prod_status字段映射到數據庫目標。