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

SQL Server text/ntext 欄位內容替換完整方案:REPLACE 轉換與 UPDATETEXT 大字段處理

     編輯:MySQL 綜合教學

SQL Server text/ntext 欄位內容替換完整方案

問題背景

text/ntext (已淘汰,建議用 varchar(max)/nvarchar(max)) 不支援直接 REPLACE,需轉換或使用 UPDATETEXT。

方案一:小欄位轉換後 REPLACE (≤ 8000/4000 字元)

DECLARE @pos INT, @len INT, @str NVARCHAR(4000), @des NVARCHAR(4000), @count INT;
SET @des = '';  -- 目標字串
SET @len = LEN(@des);
SET @str = '';         -- 替換字串
SET @count = 0;

WHILE 1=1 BEGIN
    -- 尋找目標位置
    SELECT @pos = PATINDEX('%' + @des + '%', col) - 1
    FROM t WHERE 條件;
    
    IF @pos >= 0 BEGIN
        DECLARE @ptrval BINARY(16);
        SELECT @ptrval = TEXTPTR(col) FROM t WHERE 條件;
        UPDATETEXT t.col @ptrval @pos @len @str;
        SET @count = @count + 1;
    END ELSE BREAK;
END
SELECT @count;  -- 替換次數統計

關鍵函數說明

函數用途
TEXTPTR(col)取得 text/ntext 欄位的 16 位元組指標
PATINDEX(pattern, col)搜尋模式首次出現位置 (1-based)
UPDATETEXT table.col @ptr @pos @delete_len @insert_str在指標位置替換指定長度字串

方案三:ALTER COLUMN 限制與替代方案 (修改欄位屬性)

ALTER COLUMN 不支援修改 text/image/ntext/timestamp 欄位。

替代方案:新增欄位 → 複製資料 → 重命名 → 刪除舊欄位

-- 單一視圖
EXEC sp_refreshview 'view_name';

-- 批次重新整理所有視圖
DECLARE @vName SYSNAME;
DECLARE cur CURSOR FOR SELECT name FROM sysobjects WHERE xtype='V' ORDER BY crdate;
OPEN cur; FETCH NEXT FROM cur INTO @vName;
WHILE @@FETCH_STATUS <> -1 BEGIN
    EXEC sp_refreshview @vName;
    PRINT 'View ' + @vName + ' refreshed';
    FETCH NEXT FROM cur INTO @vName;
END
CLOSE cur; DEALLOCATE cur;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved