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
相关产品推荐
相关产品推荐

