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