資料欄位儲存以特定分隔符號(如逗號、分號、管線符)串接的多值字串,需**僅更新第 N 個片段**,其餘保持不動。例如:'a,b,c,d,e' → 將第 3 片段改為 'test' → 'a,b,test,d,e'。
CHARINDEX 一定能找到下一個分隔符。@pos 次:每輪將搜尋起點移至上一個分隔符之後。@I = 目標片段起始位置,@J = 目標片段結束位置(下一分隔符位置)。STUFF 替換:DECLARE
@s VARCHAR(8000) = 'a,b,c,d,e', -- 原字串
@split CHAR(1) = ',', -- 分隔符
@pos INT = 3, -- 目標片段序號(1-based)
@value VARCHAR(100) = 'test', -- 新值
@splitlen INT,
@i INT, @j INT;
SELECT @splitlen = LEN(@split + 'x') - 2, -- 分隔符實際長度(支援多字元分隔符)
@i = 1,
@j = CHARINDEX(@split, @s + @split); -- 首個分隔符位置
-- 迴圈定位第 @pos 個片段
WHILE @pos > 0 AND @i <= @j
BEGIN
SELECT @pos = @pos - 1,
@i = @j + @splitlen + 1,
@j = CHARINDEX(@split, @s + @split, @i);
END
-- 依邊界情況替換
SELECT @s = CASE
WHEN @i < @j THEN STUFF(@s, @i, @j - @i, @value) -- 中間片段
WHEN @j > LEN(@s) THEN @s + @value -- 尾端新增(原無第 N 片段)
WHEN @i = @j THEN STUFF(@s, @i, 0, @value) -- 空片段插入
ELSE @s END;
SELECT @s AS Result; -- 輸出: a,b,test,d,e
| 函數 | 用途 |
|---|---|
CHARINDEX(sub, str, start) | 從 start 位置尋找 sub 首次出現位置 |
STUFF(str, start, len, new) | 刪除 str 從 start 長度 len 的字元,插入 new |
LEN(str) | 字串長度(不含尾端空白) |