首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

解決 SSIS「Unicode 與非 Unicode 字串無法轉換」錯誤:三種實務方案

     編輯:關於SqlServer

錯誤訊息

錯誤 0xC02020F6: 資料流程任務: 資料行 "column" 無法在 Unicode 和非 Unicode 字串資料類型之間轉換。

根因

Excel 來源欄位預設為 Unicode (DT_WSTR/DT_NTEXT),目的地資料表欄位為非 Unicode (VARCHAR/TEXT),SSIS 預設不允許隱含轉換。

方案一:修改目的地資料表欄位型別 (最徹底)

ALTER TABLE TargetTable ALTER COLUMN ColName NVARCHAR(255);  -- 或 NTEXT
  • 優點:來源/目的地型別一致,無轉換損失。
  • 缺點:需修改 Schema,可能影響其他應用。

方案二:中繼暫存表 + 明確轉換 (不動正式表)

  1. 建立暫存表,欄位型別對應 Excel (Unicode)。
  2. 資料流程:Excel 來源 → OLE DB 目的地 (暫存表)。
  3. 執行 SQL 工作:INSERT INTO FormalTable SELECT CAST(Col AS VARCHAR(...)) FROM #Temp;
  • 優點:正式表結構不變,可在 SQL 層控制轉換邏輯。
  • 缺點:增加一階段、需額外儲存空間。

方案三:資料流程內加入「資料轉換」元件 (無額外物件)

  1. 資料流程:Excel 來源 → 資料轉換 → OLE DB 目的地。
  2. 編輯「資料轉換」:將輸入欄位 Copy Column 並指定輸出型別為 DT_STR (非 Unicode)。
  3. 將轉換後欄位對應至目的地。
  • 優點:全程在 SSIS 內完成,部署單一套件。
  • 缺點:大量欄位時逐一設定繁瑣;可腳本自動化產生套件 XML。

進階技巧:腳本元件批次轉換

// Script Component (Transformation)
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    foreach (var prop in Row.GetType().GetProperties())
    {
        if (prop.PropertyType == typeof(string) && prop.Name.EndsWith("_Unicode"))
        {
            var nonUniProp = Row.GetType().GetProperty(prop.Name.Replace("_Unicode", ""));
            if (nonUniProp != null) nonUniProp.SetValue(Row, (string)prop.GetValue(Row));
        }
    }
}

選擇建議

核心原則:**來源與目的地字串型別一致** (同為 Unicode 或同為非 Unicode) 即可避免此錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
情境建議方案
可修改正式表、長期專案方案一 (改 NVARCHAR)
正式表不可動、需稽核轉換邏輯方案二 (暫存表 + SQL CAST)
快速修復、欄位不多方案三 (資料轉換元件)