常見需求:前端傳入逗號分隔的 ID 清單(如 '101,102,103'),存儲過程需拆解並逐筆寫入關聯表。本文示範純 T-SQL 迴圈處理邏輯。
DECLARE @UserList NVARCHAR(MAX) = '101,102,103';
DECLARE @ID UNIQUEIDENTIFIER = NEWID();
DECLARE @idx INT;
WHILE LEN(@UserList) > 0 BEGIN
SET @idx = CHARINDEX(',', @UserList);
-- 單一元素(無逗號或最後一個)
IF @idx = 0 BEGIN
INSERT INTO BIS_MsgCenterInfo (ID, MsgID, UserID, [State])
VALUES (NEWID(), @ID, @UserList, 0);
BREAK;
END
-- 多元素:取第一段寫入,移除已處理部分
IF @idx > 1 BEGIN
INSERT INTO BIS_MsgCenterInfo (ID, MsgID, UserID, [State])
VALUES (NEWID(), @ID, LEFT(@UserList, @idx - 1), 0);
END
SET @UserList = RIGHT(@UserList, LEN(@UserList) - @idx);
END
CHARINDEX(',', @UserList) 找第一個逗號位置。@idx = 0 代表已是最後一個元素,直接寫入並 BREAK。LEFT(@UserList, @idx - 1) 取得當前元素;RIGHT(...) 移除已處理部分含逗號。STRING_SPLIT + INSERT ... SELECT 集合式寫入,效能遠優於 RBAR 迴圈。STRING_SPLIT 不保證順序,需搭配 ORDINAL(SQL 2022+)或自行加流水號。此範例適用於舊版本或簡單邏輯,掌握基礎字串操作技巧。