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

SQL Server 2000 升級 2008 遇「半個漢字」導入失敗:批量清洗方案實戰

     編輯:關於SqlServer

問題背景

歷史數據從 SQL Server 2000 遷移至 2008,導入工具報錯:
OLE DB 訪問接口 'STREAM' 返回了對列 '[!BulkInsert].***' 無效的數據

根因:早期導入數據時,字符串末尾漢字被截斷,存入「半個漢字」(雙字節字符僅存高位字節)。SQL 2000 寬容處理(僅顯示異常),SQL 2008 嚴格校驗拒絕導入。

解決策略:只能清洗,不能保留

經協商,領導同意「去掉最後半個漢字」——必須批量處理,不可逐表寫程序。

土辦法三步走(經驗證有效)

  1. 必須用 SQL 2000 導入工具(Enterprise Manager → 匯出數據)
    SQL 2008 工具界面慢、報錯即退出;SQL 2000 工具錯誤提示精確到「第幾行、哪個字段」。
  2. 先導全部表,記錄報錯表
  3. 針對報錯表的具體字段逐個清洗

清洗核心邏輯:截斷最後一個字節

-- 針對 varchar 字段,移除最後一個字節(若為半個漢字的高位字節)
UPDATE TargetTable
SET ProblemColumn = SUBSTRING(ProblemColumn, 1, DATALENGTH(ProblemColumn) - 1)
WHERE DATALENGTH(ProblemColumn) > 0
  AND SUBSTRING(ProblemColumn, DATALENGTH(ProblemColumn), 1) BETWEEN 0x80 AND 0xFF; -- 簡易判斷高位字節

若字段較多,可動態生成腳本:

SELECT 'UPDATE ' + TABLE_NAME + ' SET ' + COLUMN_NAME + 
       ' = SUBSTRING(' + COLUMN_NAME + ', 1, DATALENGTH(' + COLUMN_NAME + ') - 1) ' +
       'WHERE DATALENGTH(' + COLUMN_NAME + ') > 0 ' +
       'AND SUBSTRING(' + COLUMN_NAME + ', DATALENGTH(' + COLUMN_NAME + '), 1) BETWEEN 0x80 AND 0xFF;'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('varchar', 'char') 
  AND TABLE_NAME IN ('報錯表1', '報錯表2', ...);

避坑指南

  • 清洗前務必備份原始數據
  • 清洗後用 SELECT * FROM Table WHERE COLUMN LIKE '%[^ -~]%' 抽樣檢查是否仍有亂碼
  • 若涉及 nvarchar,問題通常不存在(Unicode 存儲完整雙字節)
  • 升級路徑建議:2000 → 2005 → 2008,中間用 2005 導入/導出可自動處理部分編碼問題

教訓

歷史數據遷移最怕「不見不散」的髒數據。導入前先用 SQL 2000 工具跑一遍試導入,收集所有報錯表/字段,批量生成清洗腳本,一次性修復,比逐表調試節省 90% 時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved