【问题标题】:How to query a xml data type in SQL?如何在 SQL 中查询 xml 数据类型?
【发布时间】:2022-12-04 17:50:54
【问题描述】:

我在 sql 中有这个 xml 数据。

<Bakery xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Bakery">
  <name>My Bakery</name>
  <sandwiches>
    <Sandwich>
      <breadType>White</breadType>
      <ingredients>
        <Ingredient>
          <name>Cucumber</name>
          <price>0.05</price>
        </Ingredient>
        <Ingredient>
          <name>Tomato</name>
          <price>0.15</price>
        </Ingredient>
      </ingredients>
      <name>Chicken Sandwich</name>
      <price>0.25</price>
    </Sandwich>  
  </sandwiches>
</Bakery>

我尝试通过以下方式查询面包店的名称:

SELECT X.Y.value('(name)[1]', 'VARCHAR(100)') as 'Bakery Name' FROM BAKERY as b 
cross APPLY b.Bakery_record.nodes('Bakery') as X(Y)

但我得到的结果只是一个空单元格。

我还尝试像下面这样查询 BreadType:

SELECT X.Y.value('(breadType)[1]', 'VARCHAR(100)') as 'Bread Type' FROM BAKERY as b 
cross APPLY b.Bakery_record.nodes('Bakery/sandwiches/Sandwich') as X(Y)

但结果我也得到了一个空单元格。

我错过了什么?

【问题讨论】:

    标签: sql


    【解决方案1】:

    您需要为 XPath 表达式中的元素指定命名空间。在本例中,命名空间为 http://schemas.datacontract.org/2004/07/Bakery,因此您可以在查询中使用 WITH XMLNAMESPACES 子句来定义命名空间,如下所示:

    WITH XMLNAMESPACES('http://schemas.datacontract.org/2004/07/Bakery' AS ns)
    SELECT X.Y.value('(ns:name)[1]', 'VARCHAR(100)') as 'Bakery Name' FROM BAKERY as b 
    cross APPLY b.Bakery_record.nodes('ns:Bakery') as X(Y)
    

    这同样适用于第二个查询。您需要在 XPath 表达式中指定命名空间,如下所示:

    WITH XMLNAMESPACES('http://schemas.datacontract.org/2004/07/Bakery' AS ns)
    SELECT X.Y.value('(ns:breadType)[1]', 'VARCHAR(100)') as 'Bread Type' FROM BAKERY as b 
    cross APPLY b.Bakery_record.nodes('ns:Bakery/ns:sandwiches/ns:Sandwich') as X(Y)
    

    这应该返回预期的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2018-01-26
      相关资源
      最近更新 更多