XPath查询通过XML表查找供应商名称

时间:2017-12-05 23:47:11

标签: sql-server sqlxml

我试图找出有一个名为Herman的供应商的城市。我们通过Microsoft SQL Server Management Studio使用XPath。

我不是CIS专业,我不知道从哪里开始。这就是我寻求帮助的原因......

我创建了以下表格:

CREATE TABLE Tb_Supplier(
XMLColumn XML)
GO

INSERT Tb_Supplier VALUES(
    '<SuppliersList>
      <Supplier name="Joe">
        <City>Paris</City>
        <Product name="Airplane"/>
        <Product name="Milk"/>
        <Product name="TV"/>
        <Product name="Orange"/>
     </Supplier>
      <Supplier name="Herman">
        <City>Chicago</City>
        <Product name="Orange"/>
     </Supplier>
     <Supplier name="Bernstein">
        <City>Madison</City>
        <Product name="Truck"/>
        <Product name="TV"/>
      </Supplier>
     <Supplier name="Hunter">
        <City>Wausau</City>
      </Supplier>
      <Supplier name="Mayer">
        <City>Madison</City>
      </Supplier>
      <Supplier name="Rosenfeld">
        <City>Chicago</City>
        <Product name="Computer"/>
        <Product name="Book"/>
        <Product name="Truck"/>
      </Supplier>
    </SuppliersList>');

输出应该显示:

<City>Chicago</City>

我通过以下方式让它工作:

SELECT XMLColumn.query('/SuppliersList/Supplier[@name="Herman"]/City')
FROM Tb_Suppliers

我有点掌握事物。 目前我无法找到以下内容: 列出的产品是电视,并在麦迪逊提供。 显然,输出将是因为它正在寻找电视。

到目前为止我有这个,我不知道我做错了什么,因为这对我来说最有意义。

SELECT XMLColumn.query('/SuppliersList/Supplier/Product[@name="TV"]/../City[@name="Madison"]/../Product')
FROM Tb_Suppliers

2 个答案:

答案 0 :(得分:1)

这取决于你是否知道,只有一个&#34; Herman&#34;在你的清单中。然后,.value()使用相应的XPath

进行纯粹的通话
SELECT XMLColumn.value(N'(/SuppliersList/Supplier[@name="Herman"]/City/text())[1]',N'nvarchar(max)') AS Herman_City
FROM Tb_Supplier 

如果您需要多个,则需要.nodes()来获取派生表,并在相对路径上(value()以下的节点下方)获取.nodes()

SELECT AllHerman.cities.value(N'(City/text())[1]',N'nvarchar(max)') AS Herman_City
FROM Tb_Supplier
CROSS APPLY XMLColumn.nodes(N'/SuppliersList/Supplier[@name="Herman"]') AS AllHerman(cities) 

答案 1 :(得分:0)

不好告诉你该怎么做,但我会给你一些提示。 https://msdn.microsoft.com/en-us/library/ms189075%28SQL.90%29.aspx?f=255&MSPPError=-2147217396

/* find Supplier who have truck-product */ 
    SELECT XMLColumn.query('/SuppliersList/Supplier/Product[@name="Truck"]/..') from Tb_Supplier

@符号表示“属性”。该url显示了如何查询元素值(语法与属性略有不同)。

“/”表示向下导航(或有时向上)。

“..”表示“将层次结构提升一级”。

这应该足以让你前进。