Sql-Server

由於可能失去數據,無法轉換該值

  • December 23, 2014

首先讓我澄清一下,這不是一個重複的問題,也不是一個潛在的重複問題。我已經嘗試對 StackOverflow 和 DBA Stack Exchange 上已經存在的這個問題的每一個變體實施每一個答案,但沒有任何運氣。

在過去的兩天裡,我一直在努力解決這個問題(每天工作大約 7 個小時),即使在Google搜尋這個問題之後,似乎沒有其他人遇到與我的問題完全相同的變體。

我想做什麼?

在 SSIS 中,我試圖從 CSV 文件中讀取數據,並將其中的行插入到 OLE DB 數據庫中。為此,我做了最簡單的設置,如下所示。

  1. Flat File Source- 讀取 CSV 行。
  2. Derived Column- 目前什麼都不做(它只是為了試驗)。
  3. Data Conversion- 目前什麼都不做(它只是為了試驗)。
  4. OLE DB Destination- 將行儲存在數據庫中。

當我嘗試執行它時,它會在我的OLE DB 目標處停止執行,並顯示以下錯誤消息。

輸入“OLE DB 目標輸入”(51) 上的輸入列“金額”(187) 存在錯誤。返回的列狀態為:“由於可能失去數據,無法轉換該值。”。

失敗的列 ( Amount) 目前是 類型DT_STR。它似乎是我現在最信任的類型。

我嘗試了什麼?

  • 我嘗試在Flat File Connection失敗的列上使用“建議類型”功能。這使它推薦了Single byte signed int數據類型。

    • 停在我的平面文件源
    • 錯誤數據轉換失敗。“金額”列的數據轉換返回狀態值 2 和狀態文本“由於可能失去數據,無法轉換該值。”。
  • 我嘗試使用 將Derived Column列轉換為DT_I4.

    • 停在我的Derived Column
    • 錯誤數據轉換失敗。“金額”列的數據轉換返回狀態值 2 和狀態文本“由於可能失去數據,無法轉換該值。”。
  • 我嘗試使用 將Data Conversion列的值轉換為DT_I4.

    • 停在我的Data Conversion.
    • 錯誤數據轉換失敗。“金額”列的數據轉換返回狀態值 2 和狀態文本“由於可能失去數據,無法轉換該值。”。
  • 我嘗試更改DT_STR源和目​​標中值的長度。

    • 根據設置在源或目的地停止。
  • 我嘗試使用 Excel 源連接器進行連接,而不是添加IMEX=1添加到連接字元串。沒有運氣。

我的程式意識告訴我,我搞砸了。對於這麼簡單的事情,我從來沒有遇到過這麼大的問題。

為什麼我不能忽略數據的“潛在”失去?至少可以說真的很令人沮喪。

我的系統

這是一台安裝了 SQL Server 2008 的 Windows Server 2008 R2 機器。機器本身已通過 Windows Update 進行全面更新。

我遇到過幾次,問題是導出/導入參數中的數據類型不匹配。首先要做的是通過右鍵點擊源或目標來檢查這些參數,選擇高級編輯器。轉到輸入和輸出屬性並檢查所有項目的該列的數據類型 - 外部、輸出和輸入。我通常在這裡看到一個差異,通常一個是 Unicode (WSTR),另一個是 I4 或 DSTR。

忽略錯誤

首先,您應該能夠通過轉到平面文件源、錯誤輸出然後將“截斷”下的“失敗組件”更改為“忽略錯誤”來忽略字元串截斷。

更好的解決方案

真正的問題可能是 SSIS 管道中的字元串長度仍然是錯誤的,因為它是在較早的時候初始化的。

您可以通過點兩下平面文件源中的綠色箭頭(或在派生列/數據轉換之後)並選擇“元數據”來確定是否是這種情況。在那裡您可以看到管道內欄位的長度。

如果經常看到元數據不再匹配源組件,主要是通過嚮導創建平面文件源及其相應的連接。

我的建議是刪除連接和平面文件源並重新創建它們,因為我還沒有找到將管道元數據與源組件重新同步的方法。

引用自:https://dba.stackexchange.com/questions/48126