REPLACE 僅支援 VARCHAR/NVARCHAR,TEXT/NTEXT/IMAGE (已棄用) 需轉換後才能替換。本文提供各資料類型的替換語法、長度限制繞過方案與大物件 (LOB) 最佳實踐。
UPDATE tbl SET col = REPLACE(col, 'old_str', 'new_str');
UPDATE tbl SET txt_col = REPLACE(CAST(txt_col AS VARCHAR(8000)), 'old', 'new');
UPDATE tbl SET ntxt_col = REPLACE(CAST(ntxt_col AS NVARCHAR(4000)), N'舊', N'新');
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 應用層分批讀取-替換-寫回 | 超長 LOB、需事務一致性 | 無長度限制、可控交易 | 需撰寫程式碼、網路往返 |
| CLR 存儲過程 (C#) | 頻繁大物件操作 | 效能佳、功能豐富 | 需啟用 CLR、部署組件 |
| 遷移至 VARCHAR(MAX)/NVARCHAR(MAX) | SQL Server 2005+ 新專案 | 原生支援 REPLACE、無 8000 限制 | 需變更結構、重建索引 |
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'UPDATE ' + QUOTENAME(TABLE_SCHEMA) + N'.' + QUOTENAME(TABLE_NAME) +
N' SET ' + QUOTENAME(COLUMN_NAME) + N' = REPLACE(' + QUOTENAME(COLUMN_NAME) + N', ''https://old.com'', ''https://new.com'');'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('varchar','nvarchar','text','ntext')
AND CHARACTER_MAXIMUM_LENGTH IN (8000, 4000, -1) -- -1 = MAX
AND TABLE_NAME LIKE 'tbl_%';
EXEC sp_executesql @sql;
REPLACE 區分大小寫 (依照定序),不區分需 REPLACE(UPPER(col), UPPER('old'), 'new') 或定序 _CI_AS。CHECKPOINT / 簡單復原模式。STRING_AGG、TRANSLATE 等新函數簡化複雜替換。