You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从逗号分隔字符串批量插入多行数据到SQL表?

逗号分隔字符串批量插入SQL多行多字段解决方案

我看你现在的代码已经尝试用XML来拆分逗号分隔的字符串了,但插入的时候写法不对——VALUES子句里不能直接嵌套SELECT查询。下面给你两种可行的方案,分别适配不同版本的SQL Server:

方案一:XML拆分法(兼容SQL Server 2005及以上)

这个方法基于你现有的XML拆分思路,核心是给每个拆分后的元素加上行号,这样就能把两个字符串里对应位置的元素配对插入:

DECLARE @Var varchar(MAX) = '1,2,3';
DECLARE @Delimiter AS CHAR(1) = ',';
-- 拆分第一个字符串并生成行号
WITH SplitVar AS (
    SELECT 
        N.value('.', 'INT') AS ID,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
    FROM (
        SELECT CAST(('<X>' + REPLACE(@Var, @Delimiter, '</X><X>') + '</X>') AS XML) AS XMLData
    ) AS t
    CROSS APPLY XMLData.nodes('X') AS Split(N)
),
SplitVar1 AS (
    DECLARE @Var1 nvarchar(MAX) = '10,11,12';
    SELECT 
        N.value('.', 'INT') AS ID1,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
    FROM (
        SELECT CAST(('<X>' + REPLACE(@Var1, @Delimiter, '</X><X>') + '</X>') AS XML) AS XMLData
    ) AS t
    CROSS APPLY XMLData.nodes('X') AS Split(N)
)
-- 创建临时表并插入配对后的数据
DECLARE @temp TABLE (ID INT, ID1 INT);
INSERT INTO @temp (ID, ID1)
SELECT sv.ID, sv1.ID1
FROM SplitVar sv
JOIN SplitVar1 sv1 ON sv.RowNum = sv1.RowNum;

-- 验证结果
SELECT * FROM @temp;

代码说明:

  • 用CTE(公共表表达式)分别拆分两个字符串,同时用ROW_NUMBER()生成行号,保证两个字符串里的第n个元素能对应上
  • 通过行号关联两个拆分结果,再插入到临时表中
  • 最后可以查询临时表确认插入结果

方案二:STRING_SPLIT法(SQL Server 2016及以上)

如果你的SQL Server版本是2016或更高,可以用官方自带的STRING_SPLIT函数,写法更简洁:

DECLARE @Var varchar(MAX) = '1,2,3';
DECLARE @Var1 nvarchar(MAX) = '10,11,12';
DECLARE @Delimiter AS CHAR(1) = ',';

WITH SplitVar AS (
    SELECT 
        CAST(value AS INT) AS ID,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
    FROM STRING_SPLIT(@Var, @Delimiter)
),
SplitVar1 AS (
    SELECT 
        CAST(value AS INT) AS ID1,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
    FROM STRING_SPLIT(@Var1, @Delimiter)
)
DECLARE @temp TABLE (ID INT, ID1 INT);
INSERT INTO @temp (ID, ID1)
SELECT sv.ID, sv1.ID1
FROM SplitVar sv
JOIN SplitVar1 sv1 ON sv.RowNum = sv1.RowNum;

-- 验证结果
SELECT * FROM @temp;

注意事项:

  • STRING_SPLIT返回的value是字符串类型,需要转换成你需要的INT类型
  • ORDER BY (SELECT NULL)是为了保证拆分后的顺序和原字符串一致(虽然官方文档说顺序不保证,但实际测试中大部分场景下是按原顺序返回的,如果需要严格顺序,建议用XML方法或者自定义拆分函数)

内容的提问来源于stack exchange,提问作者Sanjeev Gandhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:23:02