錯誤情境:設定異動複寫初始化訂閱時,發生錯誤 MSSQL_REPL20037 / 4813:「在資料流中缺少用於大量複製 text、ntext 或 image 資料的文字長度。」
進程無法向表 "dbo"."Company" 進行大容量複製。
在資料流中缺少用於大容量複製 text、ntext 或 image 資料的文字長度。 (錯誤號: 4813)
EXEC sp_configure 'max text repl size', 2147483647; -- 最大值 2GB
RECONFIGURE;
或 SSMS → 伺服器屬性 → 進階 → 最大文字複寫大小 (B) 改大。實測仍失敗。
問題資料表 Company 含一個 text/ntext/image 欄位,資料極長且包含特殊字元(HTML 標籤、<&%|^ 等)。BCP 大量複製時無法正確解析長度前置碼。
| 原型別 | 目標型別 |
|---|---|
| varchar / char | nvarchar / nchar |
| text | ntext |
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;
nvarchar/ntext) 使用雙位元組固定寬度編碼,BCP 可直接依位元組長度計算,不需解析變長編碼前置碼。nvarchar/nchar/nvarchar(max)),除非有極嚴格儲存空間限制且確定純 ASCII。nvarchar(max) 取代 ntext(已棄用)。徹底統一為 Unicode 型別,可一次解決複寫、BCP、SSIS、跨平台匯出等多種大量資料移動場景的編碼與長度解析問題。