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

如何将SQL Server中单表竖线分隔行拆分插入新表多列?

解决SQL Server中竖线分隔字符串拆分到多列的问题

针对你固定26列、竖线分隔且首尾带竖线的场景,推荐两种不依赖固定字符位置的方法,替代容易出错的SUBSTRING写法:

方法1:利用STRING_SPLIT(SQL Server 2022及以上版本)

SQL Server 2022新增了STRING_SPLIT的ordinal参数,能直接获取每个拆分项的顺序位置,配合PIVOT可以快速将行转成对应列:

INSERT INTO dbo.tblNew (Column1, Column2, ..., Column26)
SELECT [1], [2], [3], ..., [26]
FROM (
    SELECT 
        TRIM(value) AS split_value, -- 自动清理每个值前后的空格
        ordinal
    FROM #tblTemp
    -- 先去掉首尾的竖线,再按竖线拆分字符串
    CROSS APPLY STRING_SPLIT(TRIM(BOTH '|' FROM tempData), '|', 1)
) AS src
PIVOT (
    MAX(split_value) FOR ordinal IN ([1], [2], [3], ..., [26])
) AS pvt;

方法2:XML拆分法(兼容SQL Server 2012及以上版本)

如果你的SQL Server版本低于2022,用XML转换的方式也能按顺序拆分字符串:

INSERT INTO dbo.tblNew (Column1, Column2, ..., Column26)
SELECT
    -- 按顺序提取第1到26个节点的内容,TRIM清理空格
    TRIM(xmlData.value('/root[1]/item[1]', 'VARCHAR(100)')) AS Column1,
    TRIM(xmlData.value('/root[1]/item[2]', 'VARCHAR(100)')) AS Column2,
    ...
    TRIM(xmlData.value('/root[1]/item[26]', 'VARCHAR(100)')) AS Column26
FROM (
    SELECT 
        -- 将原字符串转换为XML结构:把竖线替换成XML节点标签
        CAST('<root><item>' + REPLACE(TRIM(BOTH '|' FROM tempData), '|', '</item><item>') + '</item></root>' AS XML) AS xmlData
    FROM #tblTemp
) AS src;

两种方法的优势

相比你之前用SUBSTRING的写法,这两种方法都不依赖固定的字符位置,不管每个分隔项的长度如何变化,只要列数保持26不变,就能准确将每个值对应到新表的对应列中,避免了位置偏移导致的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:52:46