首頁 >資料庫 >mysql教程 >如何在 SQL Server 2012 中拆分逗號分隔的字串?

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-11 07:58:43619瀏覽

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