SQL Server将逗号分隔字符串拆分并批量插入

许南星
许南星
发布时间:2026-10-13| 5人浏览过
原创

本文介绍了在SQL Server中将逗号分隔的字符串拆分并逐条插入目标表的常见实现方式,主要包含利用CHARINDEX配合LEFT/RIGHT进行循环截取的写法及其适用场景与注意事项。

结果或目标

将形如 @UserList 的逗号分隔字符串拆解为单值,并为每个值在 BIS_MsgCenterInfo 表中生成一条记录:字段分别为 ID(新GUID)、MsgID(指定消息标识)、UserID(拆分后的单项)、[State](固定状态0)。

准备条件

  • 环境:Microsoft SQL Server(不限版本)。该方法不依赖特定系统视图,兼容性较好。
  • 示例表结构:
    • BIS_MsgCenterInfo:ID UNIQUEIDENTIFIER(主键)、MsgID INT/VARCHAR、UserID VARCHAR(100)、[State] TINYINT。
  • 输入变量:
    • @ID:当前要写入的消息标识(类型自定)。
    • @UserList:包含多个用户标识的字符串,以英文半角逗号 , 分隔。
  • 注意:本示例演示逻辑层面的“逐条拆分—插入”,若用于生产环境请结合事务、异常回滚与参数化书写,避免注入风险。

第1步:初始化循环控制

目的:定义长度判断与索引定位变量,确保能识别到最后一个元素。

-- @UserList 需事先赋值,例如 'u1,u2,u3'

第2步:遍历直到字符串耗尽

入口:@UserList 长度大于0时进入循环。
动作:寻找下一个逗号位置 @idx = CHARINDEX(',', @UserList)。

第3步:分支处理——仅一项或多项

判断A:无逗号且仍有内容
IF @idx = 0 AND LEN(@UserList) > 0
操作:直接对当前剩余字符串执行一次 INSERT 并结束循环。

判断B:存在逗号(多项目)
IF @idx > 1
操作:取逗号前部分作为当前 UserID 插入,然后更新 @UserList 为逗号之后的子串,继续下一轮循环。

边界修正:当首次遇到逗号时 @idx = 1,应跳过已占位的逗号而不截断内容。

第4步:完整脚本参考

-- 假设已在外部声明 @ID 与 @UserList
DECLARE @idx AS INT;

WHILE LEN(@UserList) > 0
BEGIN
  SET @idx = CHARINDEX(',', @UserList);

  -- 没有更多逗号,只剩最后一个元素
  IF @idx = 0 AND LEN(@UserList) > 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);

    -- 去掉已处理的 “前缀+逗号”
    SET @UserList = RIGHT(@UserList, LEN(@UserList) - @idx);
  END
  ELSE
  BEGIN
    -- @idx = 1,仅移除第一个逗号
    SET @UserList = RIGHT(@UserList, LEN(@UserList) - @idx);
  END
END

第5步:完成判断与验证

成功特征:每次插入后 BIS_MsgCenterInfo 的行数增加量等于初始字符串中的独立项数。可用 SELECT COUNT(*) FROM BIS_MsgCenterInfo WHERE MsgID = @ID; 对照预期项数进行核对。

原文有依据的排错

以下情况可能导致该写法产生非预期行为,建议按实际数据结构调整:

  • 首尾逗号或连续逗号:若 @UserList 以逗号开始/结束或包含相邻逗号,会出现空项或错位。预处理可使用 REPLACE 去除连续分隔符,或先过滤空字符串。
  • 中文标点:本例以英文半角 , 为准。若来源包含中文逗号,需在开始前统一替换。
  • 大体积字符串:超长文本循环拆分效率较低,建议改用 XML 派生表或系统函数(见下文优化建议)。

简要总结

通过 CHARINDEX 定位分隔符并结合 LEFT/RIGHT 迭代截取,是一种低门槛、兼容性强的拆分-插入做法。对早期版本或不允许引入临时表与表值函数等复杂对象的场景尤为实用。若运行于 SQL Server 2016+,可优先考虑内置函数以提升性能与可读性。

补充:更简洁的现代替代思路(无需循环)

当目标版本支持 STRING_SPLIT 时,可将逗号分隔字符串直接转为行集参与 JOIN/VALUES,减少过程式控制:

-- 使用 STRING_SPLIT(SQL Server 2016+)
INSERT INTO BIS_MsgCenterInfo(ID, MsgID, UserID, [State])
SELECT NEWID(), @ID, value, 0
FROM STRING_SPLIT(@UserList, ',')
WHERE value <> '';

若需要保留顺序或使用自定义分隔符,还可借助 CAST/CONVERT + XML 路径表达式,将单个字段展开为临时数据集后再统一入库,整体更利于查询优化器评估执行计划。

以上就是SQL Server实现将特定字符串拆分并进行插入操作的详细内容,更多关于SQL Server字符串拆分批量插入的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。