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

SQL Server 2005 複寫錯誤「大量複製 text/ntext/image 缺少文字長度」解決方案

     編輯:關於SqlServer

錯誤情境:設定異動複寫初始化訂閱時,發生錯誤 MSSQL_REPL20037 / 4813:「在資料流中缺少用於大量複製 text、ntext 或 image 資料的文字長度。」

錯誤訊息關鍵片段

進程無法向表 "dbo"."Company" 進行大容量複製。
在資料流中缺少用於大容量複製 text、ntext 或 image 資料的文字長度。 (錯誤號: 4813)

嘗試 1:調整「最大文字複寫大小」——無效

EXEC sp_configure 'max text repl size', 2147483647;  -- 最大值 2GB
RECONFIGURE;

或 SSMS → 伺服器屬性 → 進階 → 最大文字複寫大小 (B) 改大。實測仍失敗。

根因分析

問題資料表 Company 含一個 text/ntext/image 欄位,資料極長且包含特殊字元(HTML 標籤、<&%|^ 等)。BCP 大量複製時無法正確解析長度前置碼。

終極解決方案:全面轉換為 Unicode 型別

  1. 將所有 非 Unicode 型別 轉為對應 Unicode 型別:
原型別目標型別
varchar / charnvarchar / nchar
textntext
ALTER TABLE Company ALTER COLUMN LongTextCol ntext;  -- 或 nvarchar(max)
-- 批次轉換腳本範例
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
             + ' ALTER COLUMN ' + QUOTENAME(COLUMN_NAME) + ' ' 
             + CASE DATA_TYPE 
                 WHEN 'varchar' THEN 'nvarchar(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
                 WHEN 'char'    THEN 'nchar(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
                 WHEN 'text'    THEN 'ntext'
               END + '; '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('varchar','char','text')
  AND TABLE_CATALOG = DB_NAME();
EXEC sp_executesql @sql;

為何 Unicode 型別可解決?

  • Unicode 型別 (nvarchar/ntext) 使用雙位元組固定寬度編碼,BCP 可直接依位元組長度計算,不需解析變長編碼前置碼。
  • 避免代碼頁轉換與特殊字元逸出問題。

最佳實務建議

  1. 新建資料表預設使用 Unicode 型別 (nvarchar/nchar/nvarchar(max)),除非有極嚴格儲存空間限制且確定純 ASCII。
  2. 現有系統規劃 資料型別遷移專案,優先處理參與複寫、ETL、跨平台匯出的資料表。
  3. SQL Server 2019+ 建議使用 nvarchar(max) 取代 ntext(已棄用)。

徹底統一為 Unicode 型別,可一次解決複寫、BCP、SSIS、跨平台匯出等多種大量資料移動場景的編碼與長度解析問題。

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