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

SQL Server 字串拆分並批次寫入:WHILE 迴圈搭配 CHARINDEX 實作範例

     編輯:關於SqlServer

常見需求:前端傳入逗號分隔的 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

邏輯解析

  1. CHARINDEX(',', @UserList) 找第一個逗號位置。
  2. @idx = 0 代表已是最後一個元素,直接寫入並 BREAK。
  3. LEFT(@UserList, @idx - 1) 取得當前元素;RIGHT(...) 移除已處理部分含逗號。
  4. 迴圈直到字串長度為 0 結束。

進階建議

  • 若相容性允許,改用 STRING_SPLIT + INSERT ... SELECT 集合式寫入,效能遠優於 RBAR 迴圈。
  • 注意 STRING_SPLIT 不保證順序,需搭配 ORDINAL(SQL 2022+)或自行加流水號。
  • 大量資料考慮 Table-Valued Parameter (TVP) 由應用層直接傳遞結構化資料,避免字串拆解開銷。

此範例適用於舊版本或簡單邏輯,掌握基礎字串操作技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved