Sql server 在SQL Server中使用XML拆分字符串
问题:如何使用XML拆分以下字符串 输入:Sql server 在SQL Server中使用XML拆分字符串,sql-server,xml,Sql Server,Xml,问题:如何使用XML拆分以下字符串 输入: '7-VPN Connectivity 7.8 - Ready to Elixir Connector install 9-Unified Installation' 预期产出: 7-VPN Connectivity 7.8 - Ready to Elixir Connector install 9-Unified Installation 我的代码: DECLARE @xml AS XML, @st
'7-VPN Connectivity 7.8 - Ready to Elixir Connector install 9-Unified Installation'
预期产出:
7-VPN Connectivity
7.8 - Ready to Elixir Connector install
9-Unified Installation
我的代码:
DECLARE @xml AS XML,
@str AS VARCHAR(100)
SET @str = '7-VPN Connectivity 7.8 - Ready to Elixir Connector install 9-Unified Installation'
SET @xml = CAST(('<X>'+replace(@str,' ','</X><X>')+'</X>') AS XML)
SELECT
N.value('.', 'VARCHAR(10)') AS value
FROM
@xml.nodes('X') AS T(N)
这是一个可怕的设计!如果有一点点的机会来解决这个问题,你应该改变这个越快越好
你可以试试这样的东西,但是用它来清理那些乱七八糟的东西
DECLARE @YourString VARCHAR(100)='7-VPN Connectivity 7.8 - Ready to Elixir Connector install 9-Unified Installation';
WITH CutAtHyphen(Nr,part) AS
(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
,LTRIM(RTRIM(A.part.value('text()[1]','nvarchar(max)')))
FROM
(
SELECT CAST('<x>' + REPLACE((SELECT @YourString AS [*] FOR XML PATH('')),'-','</x><x>') + '</x>' AS XML) AS Casted
) AS t
CROSS APPLY t.Casted.nodes('/x') AS A(part)
)
,CutOffFinal AS
(
SELECT Nr
,part
,LEFT(part,LEN(part)-PositionOf.LastBlank) AS Remainder
,CASE WHEN Nr>1 THEN RIGHT(part,PositionOf.LastBlank) ELSE part END AS Tail
FROM CutAtHyphen
OUTER APPLY (SELECT CHARINDEX(' ',REVERSE(part))) AS PositionOf(LastBlank)
)
,recCTE AS
(
SELECT Nr, CAST(N'' AS NVARCHAR(MAX)) AS String,Tail FROM CutOffFinal WHERE Nr=1
UNION ALL
SELECT cof.Nr
,r.Tail + '-' + cof.Remainder
,cof.Tail
FROM recCTE AS r
INNER JOIN CutOffFinal AS cof ON cof.Nr=r.Nr+1
)
SELECT String + CASE WHEN Nr=(SELECT MAX(Nr) FROM CutOffFinal) THEN Tail ELSE '' END AS FinalString
FROM recCTE
WHERE Nr>1;
此代码将首先在连字符处剪切字符串并修剪它。它将搜索属于下一行的最后一个空格和数字剪切
递归CTE将沿着该行向下移动,并将前一行的尾部与当前行的其余部分连接起来
第一行和最后一行需要特殊处理。这是一个可怕的设计!如果有一点点的机会来解决这个问题,你应该改变这个越快越好
你可以试试这样的东西,但是用它来清理那些乱七八糟的东西
DECLARE @YourString VARCHAR(100)='7-VPN Connectivity 7.8 - Ready to Elixir Connector install 9-Unified Installation';
WITH CutAtHyphen(Nr,part) AS
(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
,LTRIM(RTRIM(A.part.value('text()[1]','nvarchar(max)')))
FROM
(
SELECT CAST('<x>' + REPLACE((SELECT @YourString AS [*] FOR XML PATH('')),'-','</x><x>') + '</x>' AS XML) AS Casted
) AS t
CROSS APPLY t.Casted.nodes('/x') AS A(part)
)
,CutOffFinal AS
(
SELECT Nr
,part
,LEFT(part,LEN(part)-PositionOf.LastBlank) AS Remainder
,CASE WHEN Nr>1 THEN RIGHT(part,PositionOf.LastBlank) ELSE part END AS Tail
FROM CutAtHyphen
OUTER APPLY (SELECT CHARINDEX(' ',REVERSE(part))) AS PositionOf(LastBlank)
)
,recCTE AS
(
SELECT Nr, CAST(N'' AS NVARCHAR(MAX)) AS String,Tail FROM CutOffFinal WHERE Nr=1
UNION ALL
SELECT cof.Nr
,r.Tail + '-' + cof.Remainder
,cof.Tail
FROM recCTE AS r
INNER JOIN CutOffFinal AS cof ON cof.Nr=r.Nr+1
)
SELECT String + CASE WHEN Nr=(SELECT MAX(Nr) FROM CutOffFinal) THEN Tail ELSE '' END AS FinalString
FROM recCTE
WHERE Nr>1;
此代码将首先在连字符处剪切字符串并修剪它。它将搜索属于下一行的最后一个空格和数字剪切
递归CTE将沿着该行向下移动,并将前一行的尾部与当前行的其余部分连接起来
第一行和最后一行需要特殊处理