在 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中文網其他相關文章!