【问题标题】:Get multiple xml nodes (delimited)获取多个xml节点(分隔)
【发布时间】:2014-08-26 15:01:13
【问题描述】:

我有一个带有 xml 格式的表格(为便于阅读而简化)

<parentItem xmlns:i="http://tempuri.org/1" xmlns="http://tempuri.org/2">
  <ItemA></ItemA>
  <ItemB></ItemB>
  <ItemC xmlns:d2p1="http://tempuri.org/3">
    <d2p1:string>value1</d2p1:string>
    <d2p1:string>value2</d2p1:string>
    <d2p1:string>value3</d2p1:string>
    <!-- .... (0 to many strings here) -->
  </ItemC>
</parentItem>

我唯一关心的是 parentItem > ItemC > string 中的值

我想获取由逗号等分隔的值

所需结果:“value1,value2,value3”

目前我可以通过这样做获得一个值:

SELECT CAST([QueryXml] as xml).value('(/*:parentItem/*:ItemC/node())[1]','nvarchar(max)')
FROM [opendb].[dbo].[MyTable]

结果:“value1”

我也可以像这样得到所有的值:

SELECT CAST([QueryXml] as xml).value('(/*:ConflictsSearchTermQuery/*:TermItems)[1]','nvarchar(max)')
FROM [opendb].[dbo].[ConflictsSearchTerms]

结果:“value1value2value3”

但我希望获得一组分隔的值

所需结果:“value1,value2,value3”

【问题讨论】:

    标签: sql xml sql-server-2012


    【解决方案1】:

    要从 XML 中获取多个值,您需要使用 XML 数据类型的 the nodes() method

    但是,由于此方法不返回单个标量值(而是行集),因此您需要通过CROSS APPLY 调用它。

    WITH MyTable AS (
      SELECT 1 AS ID, CAST('<parentItem xmlns:i="http://tempuri.org/1" xmlns="http://tempuri.org/2">
       <ItemA></ItemA>
       <ItemB></ItemB>
       <ItemC xmlns:d2p1="http://tempuri.org/3">
           <d2p1:string>value1</d2p1:string>
           <d2p1:string>value2</d2p1:string>
           <d2p1:string>value3</d2p1:string>
           <!-- .... (0 to many strings here) -->
       </ItemC>
    </parentItem>' AS XML) AS QueryXml
    )
    SELECT
      t.ID,
      x.node.value('.', 'varchar(100)') AS nodeValue
    FROM
      MyTable t
      CROSS APPLY QueryXml.nodes('
        declare namespace i="http://tempuri.org/1";
        declare namespace def="http://tempuri.org/2";
        declare namespace d2p1="http://tempuri.org/3";
    
        /def:parentItem/def:ItemC/d2p1:string'
      ) x(node)
    

    给你

    ID节点值 ---------- ------------------ 1 个值1 1 值2 1 值3

    之后,如果您确实需要,可以使用 SQL Server 中连接值的标准技术。

    请注意,我已经在 XQuery 中正确声明了命名空间,而不是使用 *。命名空间很重要,不要忽视它们。

    【讨论】:

    • 谢谢,希望我可以在 SSRS 中进行串联。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多