針對 TEXT、NTEXT 大物件欄位無法直接用 REPLACE 函數的限制,提供一個基於游標與 UPDATETEXT 的替換方案(註:不支援中文雙位元字元)。
TEXTPTR 指標。PATINDEX 尋找目標字串位置。UPDATETEXT 以指標、位移、長度原地替換。/* author: amjn | date: 2003-03-28 | version: 1.0
function: 替換 TEXT/NTEXT 欄位字串 (不支援中文) */
DECLARE @ptr VARBINARY(16), @amjnId INT, @Position INT, @len INT
SET @len = DATALENGTH('ILOVEHJL') -- 目標字串長度
DECLARE wux_Cursor SCROLL CURSOR FOR
SELECT TEXTPTR([Name]), [amjnId] FROM USA201 FOR READ ONLY
OPEN wux_Cursor
FETCH NEXT FROM wux_Cursor INTO @ptr, @amjnId
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Position = PATINDEX('%ILOVEHJL%', [Name]) FROM USA201 WHERE [amjnId] = @amjnId
WHILE @Position > 0
BEGIN
SET @Position = @Position - 1 -- UPDATETEXT 位移為 0-based
UPDATETEXT USA201.[Name] @ptr @Position @len 'i love hjl' -- 替換
SELECT @Position = PATINDEX('%ILOVEHJL%', [Name]) FROM USA201 WHERE [amjnId] = @amjnId
END
FETCH NEXT FROM wux_Cursor INTO @ptr, @amjnId
END
CLOSE wux_Cursor
DEALLOCATE wux_Cursor
GO
TEXTPTR 取得文字指標,UPDATETEXT 為唯一可部分更新 TEXT/NTEXT/IMAGE 的指令。PATINDEX 回傳 1-based 位置,UPDATETEXT 需 0-based,故 -1。FOR READ ONLY、SCROLL 優效能。VARCHAR(MAX)/NVARCHAR(MAX) + REPLACE。