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

SQL Server中如何拆分字符串并将每个元素存入新行?

如何将SQL中逗号分隔的列拆分成多行?

嘿,我明白你想要把表中用逗号分隔的PL列拆分成单独的行,同时保留对应的Year值对吧?你当前的查询只是把原表数据复制到临时表,还没完成拆分的核心步骤,我来给你几个实用的解决方案:

方法一:使用STRING_SPLIT(SQL Server 2016及以上版本)

如果你的SQL Server版本是2016或更新,官方提供的STRING_SPLIT函数是最简单的实现方式,搭配CROSS APPLY就能轻松关联拆分后的行和原表的Year字段:

-- 将拆分结果导入临时表
SELECT s.value AS PL, t.Year
INTO #TempTable
FROM myTable t
CROSS APPLY STRING_SPLIT(t.PL, ', ') -- 注意这里的分隔符是「逗号+空格」,和你示例里的格式匹配
WHERE s.value <> ''; -- 过滤可能出现的空值(比如原字符串首尾有空格或连续逗号的情况)

-- 查看最终结果
SELECT * FROM #TempTable;

CROSS APPLY的作用是把原表的每一行,和该行PL字段拆分后的所有行进行关联,这样每个拆分出来的编程语言都会对应原行的年份,正好符合你的需求。

方法二:递归CTE(适用于SQL Server 2016以下版本)

如果你的数据库版本不支持STRING_SPLIT,可以用递归CTE来手动实现字符串拆分:

WITH SplitCTE AS (
    -- 初始步骤:提取每个字符串的第一个元素
    SELECT 
        LEFT(PL, CHARINDEX(', ', PL + ', ') - 1) AS PL,
        STUFF(PL, 1, CHARINDEX(', ', PL + ', '), '') AS RemainingPL,
        Year
    FROM myTable
    WHERE PL IS NOT NULL AND PL <> ''

    UNION ALL

    -- 递归步骤:拆分剩余的字符串部分
    SELECT 
        LEFT(RemainingPL, CHARINDEX(', ', RemainingPL + ', ') - 1) AS PL,
        STUFF(RemainingPL, 1, CHARINDEX(', ', RemainingPL + ', '), '') AS RemainingPL,
        Year
    FROM SplitCTE
    WHERE RemainingPL IS NOT NULL AND RemainingPL <> ''
)
SELECT PL, Year
INTO #TempTable
FROM SplitCTE;

-- 查看结果
SELECT * FROM #TempTable;

这个CTE会先拆分出每个PL字符串的第一个元素,然后循环处理剩下的部分,直到所有元素都被拆分为止。

小提示

  • 一定要匹配原字符串的分隔符:你的示例里是, (逗号加空格),如果拆分时用错分隔符(比如只用逗号),可能会得到带前导空格的结果(比如 C#)。
  • 如果原数据的分隔格式不统一(比如有的是逗号无空格),可以先统一处理:REPLACE(PL, ',', ', '),再进行拆分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:09:42