Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中使用XML拆分字符串_Sql Server_Xml - Fatal编程技术网

Sql server 在SQL Server中使用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

问题:如何使用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,  
        @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将沿着该行向下移动,并将前一行的尾部与当前行的其余部分连接起来

第一行和最后一行需要特殊处理