首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

預存程序實作:替換 TEXT/NTEXT 欄位字串(游標 + UPDATETEXT)

     編輯:關於SqlServer

針對 TEXT、NTEXT 大物件欄位無法直接用 REPLACE 函數的限制,提供一個基於游標與 UPDATETEXT 的替換方案(註:不支援中文雙位元字元)。

核心邏輯

  1. 宣告游標讀取目標表主鍵與 TEXTPTR 指標。
  2. 迴圈每筆記錄,用 PATINDEX 尋找目標字串位置。
  3. 呼叫 UPDATETEXT 以指標、位移、長度原地替換。
  4. 迴圈直到該筆無匹配,再取下一筆。

完整代碼(SQL Server 2000/2005 相容)

/* 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 優效能。
  • 不支援中文: 雙位元字元會導致位移計算錯誤。SQL Server 2005+ 建議改用 VARCHAR(MAX)/NVARCHAR(MAX) + REPLACE。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved