資料庫維護中常需批次替換欄位內容(如路徑變更、關鍵字修正)。本文詳解三種層級的替換方案。
NVARCHAR(MAX))除 NTEXT 外,皆可直接用 REPLACE。
UPDATE [資料表] SET [欄位] = REPLACE([欄位], '舊字串', '新字串');
範例:替換文章標題
UPDATE [iwms_news] SET [title] = REPLACE([title], '舊字串', '新字串');
UPDATE [資料表] SET [欄位] = REPLACE(CONVERT(VARCHAR(4000), [欄位]), '舊字串', '新字串');
範例:替換文章內容
UPDATE iwms_news SET [content] = REPLACE(CONVERT(VARCHAR(4000), [content]), '舊字串', '新字串');
限制:VARCHAR(4000) 截斷超長內容,僅適合單頁 < 4000 字元。
DECLARE @ptr VARBINARY(16), @artId INT, @Position INT, @len INT;
SET @len = DATALENGTH('舊字串');
DECLARE wux_Cursor SCROLL CURSOR FOR
SELECT TEXTPTR([欄位]), [主鍵欄位] FROM [資料表] FOR READ ONLY;
OPEN wux_Cursor;
FETCH NEXT FROM wux_Cursor INTO @ptr, @artId;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Position = PATINDEX('%舊字串%', [欄位]) FROM [資料表] WHERE [主鍵欄位] = @artId;
WHILE @Position > 0
BEGIN
SET @Position = @Position - 1;
UPDATETEXT [資料表].[欄位] @ptr @Position @len '新字串';
SELECT @Position = PATINDEX('%舊字串%', [欄位]) FROM [資料表] WHERE [主鍵欄位] = @artId;
END
FETCH NEXT FROM wux_Cursor INTO @ptr, @artId;
END
CLOSE wux_Cursor;
DEALLOCATE wux_Cursor;
GO
注意:須在「查詢分析器」執行;分頁內容需同時處理主表與分頁表(如 iwms_news + iwms_pages)。
SELECT 驗證影響範圍。