我试图找出有一个名为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
答案 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显示了如何查询元素值(语法与属性略有不同)。
“/”表示向下导航(或有时向上)。
“..”表示“将层次结构提升一级”。
这应该足以让你前进。