将分号分隔符 SQL 拆分为行[重复]

2023-12-02

只是想寻求帮助。 我试图用分号作为分隔符来分割分隔值。 逗号无法替换为分号,因为有些值带有逗号。

ID   Value
1   | A&B;C;D;E, F

变换为:

ID   Value
1    A&B
1    C
1    D
1    E, F

我尝试调整网上的 SQL 脚本,但没有成功

SELECT F1.ID,
 O.splitdata 
FROM
 (
 SELECT OldID,
 cast('<X>'+replace((SELECT ColumnName + '' FOR XML PATH('')),';','</X><X>')+'</X>' as XML) as xmlfilter from TableName F
 )F1
 CROSS APPLY
 ( 
 SELECT fdata.D.value('.','varchar(max)') as splitdata 
 FROM f1.xmlfilter.nodes('X') as fdata(D)) O

它适用于我的某些列,但如果列具有特殊或非法字符,则会输出此错误:

Msg 9411, Level 16, State 1, Line 2
XML parsing: line 1, character 16, semicolon expected

Thanks!


如果您不喜欢某个函数,或者您无权创建新函数,则可以使用相当快速的 XML 方法。在您的情况下,需要一些额外的努力才能获得 XML 安全(由于特殊字符和;作为分隔符):

Declare @Dummy table (ID int, SomeTextToSplit varchar(max))
Insert Into @Dummy values
 (1,'A&B;C;D;E, F')
,(2,'"C" & "D";<C>;D;E, F');

DECLARE @Delimiter VARCHAR(10)=';';
WITH Casted AS
(
    SELECT *
          ,CAST('<x>' + REPLACE((SELECT REPLACE(SomeTextToSplit,@Delimiter,'§§Split$me$here§§') AS [*] FOR XML PATH('')),'§§Split$me$here§§','</x><x>') + '</x>' AS XML) AS SplitMe
    FROM @Dummy
)
SELECT Casted.*
      ,x.value('.','nvarchar(max)') AS Part 
FROM Casted
CROSS APPLY SplitMe.nodes('/x') AS A(x)

结果

1   A&B
1   C
1   D
1   E, F
2   "C" & "D"
2   <C>
2   D
2   E, F
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将分号分隔符 SQL 拆分为行[重复] 的相关文章

随机推荐