| 資料型別 | REPLACE 直接支援 | 處理方式 |
|---|---|---|
| VARCHAR / NVARCHAR | ✅ 是 | 直接使用 |
| CHAR / NCHAR | ✅ 是 | 直接使用 (定長補空格) |
| TEXT / NTEXT | ❌ 否 (已淘汰) | CAST 為 VARCHAR(MAX)/NVARCHAR(MAX) |
| VARCHAR(MAX) / NVARCHAR(MAX) | ✅ 是 | 直接使用 |
| VARBINARY(MAX) | ❌ 否 | CAST 為 VARCHAR(MAX) 再處理 |
UPDATE dbo.Articles
SET Content = REPLACE(Content, 'old.domain.com', 'new.domain.com')
WHERE Content LIKE '%old.domain.com%'
-- VARCHAR(8000) 上限
UPDATE dbo.OldTable
SET TextCol = REPLACE(CAST(TextCol AS VARCHAR(8000)), '舊字串', '新字串')
-- NVARCHAR(4000) 上限
UPDATE dbo.OldTable
SET NTextCol = REPLACE(CAST(NTextCol AS NVARCHAR(4000)), N'舊字串', N'新字串')
-- 無長度限制,直接操作
UPDATE dbo.LargeContent
SET Body = REPLACE(Body, 'https://', 'https://')
WHERE Body LIKE '%https://%'
UPDATE dbo.Templates
SET Template = REPLACE(REPLACE(REPLACE(Template,
'{{UserName}}', @UserName), '{{Date}}', CONVERT(VARCHAR, GETDATE(), 111)), '{{ID}}', @ID)
UPDATE dbo.Products
SET Description = CASE
WHEN Description LIKE '%舊品牌%' THEN REPLACE(Description, '舊品牌', '新品牌')
WHEN Description LIKE '%廢止%' THEN REPLACE(Description, '廢止', '停產')
ELSE Description END
UPDATE t
SET t.Content = REPLACE(t.Content, s.OldValue, s.NewValue)
FROM dbo.TargetTable t
JOIN dbo.ReplaceMap s ON t.Content LIKE '%' + s.OldValue + '%'
WHERE s.IsActive = 1
WHERE Col LIKE '%search%' 避免全表掃描無異動列LIKE 'prefix%' 可用索引;LIKE '%middle%' 需全文檢索DECLARE @BatchSize INT = 5000, @RowCount INT = 1
WHILE @RowCount > 0
BEGIN
UPDATE TOP (@BatchSize) dbo.HugeTable
SET Col = REPLACE(Col, 'old', 'new')
WHERE Col LIKE '%old%'
SET @RowCount = @@ROWCOUNT
WAITFOR DELAY '00:00:01' -- 降低鎖爭用
END
TABLOCK 提示 (需測試)舊型別單次 CAST 會截斷。解法:
ALTER TABLE dbo.OldTable ALTER COLUMN TextCol VARCHAR(MAX) -- 線上操作 (Enterprise)
-- 或
SELECT CAST(TextCol AS VARCHAR(MAX)) INTO #Tmp FROM dbo.OldTable
-- 重建表
UPDATETEXT Table.TextCol @ptr @offset @delete_len @insert_data,極度複雜、不建議-- 1. 確認影響範圍
SELECT COUNT(*) FROM dbo.Pages WHERE Content LIKE '%old-site.com%'
-- 2. 分批更新 (假設 100 萬列)
DECLARE @Batch INT = 10000, @Done INT = 1
WHILE @Done > 0
BEGIN
UPDATE TOP (@Batch) dbo.Pages
SET Content = REPLACE(Content, 'https://old-site.com', 'https://new-site.com')
WHERE Content LIKE '%https://old-site.com%'
SET @Done = @@ROWCOUNT
PRINT CAST(@Done AS VARCHAR) + ' rows updated at ' + CONVERT(VARCHAR, GETDATE(), 114)
WAITFOR DELAY '00:00:02'
END
-- 3. 驗證
SELECT COUNT(*) FROM dbo.Pages WHERE Content LIKE '%old-site.com%'
VARCHAR(MAX)/NVARCHAR(MAX)