Shred&将Concat XML转换为单列

时间:2015-06-25 20:05:45

标签: sql sql-server xml tsql

为下面的示例中的所有参数值生成连接到单列的输出的简单方法是什么,这个xml中没有ns并且我使用SQL Server 2012。

我尝试获取此输出,在xml示例的片段下方生成3列,并且我想制作1。

100 | Param1
    ,Param22
    ,Param3322

XML&代码:

DECLARE @xml XML = '<Parameters>    
                       <Parameter>       
                          <Name>Param1</Name>  
                       </Parameter>    
                       <Parameter>    
                          <Name>Param22</Name> 
                       </Parameter>    
                       <Parameter>    
                          <Name>Param3322</Name>    
                       </Parameter> </Parameters>   '

SELECT 100 id
    ,@XML xmlinfo
INTO #t -- drop table #t              --   select * from #t

DECLARE @xml XML = (
        SELECT xmlinfo
        FROM #t
        )

SELECT (
        SELECT ID
        FROM #t
        ) AS ID
    ,X.STockData.query('Name[1]').value('.', 'Varchar(10)') AS 'Parameter'
---CONCAT(X.STockData.query('Name[1]').value('.','Varchar(10)'),X.STockData.query('Name[2]').value('.','Varchar(10)')) AS 'Parameter' 
FROM @xml.nodes('Parameters/Parameter') AS X(StockData)

2 个答案:

答案 0 :(得分:1)

您可以使用XQuery for循环从XML字段构造逗号分隔值,例如:

SELECT 
    t.ID as ID
    , CAST(t.xmlinfo.query('
                       for $p in Parameters/Parameter
                       return 
                           if ($p is (Parameters/Parameter[last()])[1]) 
                                then string($p/Name[1])
                           else concat($p/Name[1], ", ")
                      ')
        AS VARCHAR(MAX)
      ) as Parameter
FROM MyTable as t

<强> Sqlfiddle Demo

上面的XQuery只是循环遍历Parameter元素,如果当前Name是最后一个Parameter,则返回Parameter子元素,否则返回Name连接Imports System Imports System.Text.RegularExpressions Public Module Module1 Public Sub Main() Dim data As String = "M123456789^M123^C123^M1234^" Dim m As Match = Regex.Match(data, "(M[^\^]+\^)") While m.Success Console.WriteLine(m.Groups(1)) m = m.NextMatch() End While End Sub End Module 逗号。

答案 1 :(得分:0)

    SELECT (
    SELECT ID
    FROM #t
    ) AS ID
   ,X.STockData.query('Name[1]').value('.', 'Varchar(10)') 
   + ', ' + X.STockData.query('Name[2]').value('.', 'Varchar(10)')
   + ', ' + X.STockData.query('Name[3]').value('.', 'Varchar(10)')
   as parameter
   FROM @xml.nodes('Parameters/Parameter') AS X(StockData)

试试这个