NTEXT、TEXT、IMAGE 為舊版大型資料類型(SQL Server 2005 起建議改用 NVARCHAR(MAX)/VARCHAR(MAX)/VARBINARY(MAX))。這些類型不支援 REPLACE() 等字串函數,直接操作會報錯。
UPDATE MyTable
SET LargeColumn = REPLACE(CAST(LargeColumn AS VARCHAR(MAX)), 'old_text', 'new_text')
WHERE LargeColumn LIKE '%old_text%';
VARCHAR(MAX) 仍受 2 GB 限制,但中介轉換可能產生大量記錄檔;超過 8000 字元時隱含轉換可能截斷(視相容性層級)。
-- 1. 建立測試環境
CREATE TABLE #Test (BigCol TEXT);
INSERT INTO #Test SELECT 'abc123abc123,asd';
-- 2. 宣告變數
DECLARE @SearchStr VARCHAR(8000) = '123',
@ReplaceStr VARCHAR(8000) = '000',
@Ptr VARBINARY(16),
@Pos INT,
@Len INT;
-- 3. 取得文字指標與搜尋長度
SELECT @Ptr = TEXTPTR(BigCol),
@Len = LEN(@SearchStr),
@Pos = CHARINDEX(@SearchStr, BigCol) - 1
FROM #Test;
-- 4. 迴圈替換所有出現位置
WHILE @Pos > 0
BEGIN
UPDATETEXT #Test.BigCol @Ptr @Pos @Len @ReplaceStr;
SELECT @Pos = CHARINDEX(@SearchStr, BigCol) - 1 FROM #Test;
END
-- 5. 驗證結果
SELECT * FROM #Test; -- 輸出: abc000abc000,asd
-- 6. 清理
DROP TABLE #Test;
| 函數/陳述式 | 用途 |
|---|---|
TEXTPTR(column) | 取得文字指標(16 位元組二進位),定位資料在頁面位置 |
CHARINDEX(str, column) | 搜尋字串位置(回傳 1-based,故 -1 轉為 0-based offset) |
UPDATETEXT table.column @ptr @offset @delete_len @insert_str | 在指標位置刪除指定長度並插入新字串 |
READTEXT / WRITETEXT | 讀取/覆寫整個大欄位 |
DATALENGTH | 取得實際位元組長度 |
ALTER TABLE ... ALTER COLUMN BigCol NVARCHAR(MAX),後續即可直接用 REPLACE()。sp_ReplaceText @Table, @Column, @Search, @Replace 重複使用。CHECKPOINT 控制記錄檔增長。STRING_SPLIT + STRING_AGG 實現集合式替換邏輯(需相容性層級 130+)。