REPLACE 是 SQL Server 內建字串函數,用於將指定子字串全部替換為新字串。支援字元與二進位資料類型,回傳型別跟隨第一個引數。本文詳細說明語法、參數、回傳型別規則、巢狀替換技巧與效能注意事項。
語法
REPLACE ( STRING_EXPRESSION1, STRING_EXPRESSION2, STRING_EXPRESSION3 )
參數說明
| 參數 | 名稱 | 說明 | 資料類型 |
| 1 | STRING_EXPRESSION1 | 被搜尋的原始字串 | CHAR, VARCHAR, NCHAR, NVARCHAR, BINARY, VARBINARY |
| 2 | STRING_EXPRESSION2 | 要尋找的子字串 (不可為空字串) | 同上 |
| 3 | STRING_EXPRESSION3 | 替換用的字串 | 同上 |
回傳型別規則
- 若引數 1 為字元類型 → 回傳字元類型 (隱含轉換至最高優先級類型)。
- 若引數 1 為二進位類型 → 回傳二進位類型。
- 若引數 1 為
NULL → 回傳 NULL。
基本範例
SELECT REPLACE('ABCDEFGHICDE', 'CDE', 'XXX');
-- 結果: ABXXXFGHIXXX
進階用法
巢狀替換:多組關鍵字一次替換
DECLARE @TEXT NVARCHAR(MAX) = N'舊系統_模組A_測試';
SELECT REPLACE(REPLACE(REPLACE(@TEXT, N'舊系統', N'新系統'), N'模組A', N'模組B'), N'測試', N'正式');
-- 結果: 新系統_模組B_正式
搭配 UPDATE 大量替換資料表欄位
UPDATE PRODUCTS
SET DESCRIPTION = REPLACE(DESCRIPTION, N'舊品牌', N'新品牌')
WHERE DESCRIPTION LIKE N'%舊品牌%';
清理資料:移除特殊字元
SELECT REPLACE(REPLACE(REPLACE(PHONE, '-', ''), '(', ''), ')', '') AS CLEAN_PHONE
FROM CUSTOMERS;
效能與限制
- ⚠️
REPLACE 會掃描整個字串,對大型 VARCHAR(MAX)/NVARCHAR(MAX) (如 > 1MB) 效能較差。
- ⚠️ 無法使用萬用字元,需精確匹配子字串。
- ✅ 針對固定模式清理 (如電話格式、代碼前綴) 效能極佳。
- ✅ 可建立計算欄持久化替換結果,避免重複計算。
相關函數對照
| 函數 | 用途 | 差異 |
| REPLACE | 全域替換所有匹配 | 不可用萬用字元 |
| STUFF | 指定位置/長度刪除並插入 | 精確控制位置 |
| TRANSLATE (SQL 2017+) | 字元對字元對應替換 | 單字元映射,速度更快 |
| REGEXP_REPLACE (Azure SQL / 2022+) | 正規表示式替換 | 支援複雜模式 |