将XML文档分割并拼接成单列

3

以下是一个示例,其中涉及Parameter值的输出需要以单列连接的简单方式产生,此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)

我在表格 #t 中有一个原始的 XML 列,不确定如何从表格中引用该列,所以将其放回 @xml 变量中。我也尝试使用 CONCAT,但它没有起作用。 - Mario Trento
2个回答

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演示

上面的XQuery简单地循环遍历Parameter元素,并在当前Parameter是最后一个Parameter时返回Name子元素,否则返回逗号连接的Name


@MarioTrento 请考虑接受此答案-也许还可以点个赞-以确认这是您选择的解决方案。谢谢。 - har07

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)

试试这个


感谢har和vkp,我选择har的解决方案,因为参数的数量可能不同。非常感谢。 - Mario Trento

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接