首页 >数据库 >mysql教程 >如何在 SQL Server 2012 中拆分逗号分隔的字符串?

如何在 SQL Server 2012 中拆分逗号分隔的字符串?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-11 07:58:43582浏览

How to Split Comma-Separated Strings in SQL Server 2012?

在 SQL Server 2012 中替代 STRING_SPLIT 函数

SQL Server 2016 中引入的 STRING_SPLIT 函数提供了一种便捷的方式来将逗号分隔的字符串拆分成单个元素。但是,对于使用 SQL Server 2012 的用户来说,由于缺少此功能,需要一种变通方法。

替代拆分方法

要在 SQL Server 2012 中拆分逗号分隔的值,请考虑使用以下基于 XML 的方法和 CROSS APPLY:

<code class="language-sql">SELECT Split.a.value('.', 'NVARCHAR(MAX)') AS DATA
FROM
(
    SELECT CAST('<X>'+REPLACE(@ID, ',', '</X><X>')+'</X>' AS XML) AS String
) AS A
CROSS APPLY String.nodes('/X') AS Split(a);</code>

示例用法

假设参数 @ID 包含一个由逗号分隔的数字列表:

<code class="language-sql">@ID varchar = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20';</code>

执行查询将 @ID 拆分成其各个组成部分:

<code>DATA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20</code>

高级示例

此方法可以扩展到创建更复杂的查询。例如,以下查询将 @ID 和 @Marks(另一个逗号分隔的列表)拆分成名为 @StudentsMark 的表,并将每个 ID 与其对应的分数关联起来:

<code class="language-sql">DECLARE @ID NVARCHAR(300)= '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20';
DECLARE @Marks NVARCHAR(300)= '0,1,2,5,8,9,4,6,7,3,5,2,7,1,9,4,0,2,5,0';
DECLARE @StudentsMark TABLE
(id    NVARCHAR(300),
 marks NVARCHAR(300)
); 
;WITH CTE
     AS (
     SELECT Split.a.value('.', 'NVARCHAR(MAX)') id,
            ROW_NUMBER() OVER(ORDER BY
                             (
                                 SELECT NULL
                             )) RN
     FROM
     (
         SELECT CAST('<X>'+REPLACE(@ID, ',', '</X><X>')+'</X>' AS XML) AS String
     ) AS A
     CROSS APPLY String.nodes('/X') AS Split(a)),
     CTE1
     AS (
     SELECT Split.a.value('.', 'NVARCHAR(MAX)') marks,
            ROW_NUMBER() OVER(ORDER BY
                             (
                                 SELECT NULL
                             )) RN
     FROM
     (
         SELECT CAST('<X>'+REPLACE(@Marks, ',', '</X><X>')+'</X>' AS XML) AS String
     ) AS A
     CROSS APPLY String.nodes('/X') AS Split(a))
     INSERT INTO @StudentsMark
            SELECT C.id,
                   C1.marks
            FROM CTE C
                 LEFT JOIN CTE1 C1 ON C1.RN = C.RN;
SELECT *
FROM @StudentsMark;</code>

以上是如何在 SQL Server 2012 中拆分逗号分隔的字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn