如何根据SQL中的条件选择xml数据

时间:2015-02-26 08:49:54

标签: sql sql-server xml xpath

下面是我的xml

DECLARE @myDoc xml
DECLARE @ProdID int
SET @myDoc = 
'<Root>
<ProductDescription>
<ProductID>1</ProductID>
<ProductName>Road Bike</ProductName>
<GenID>0C866AE2-7AAA-474F-8794-7538986268AE</GenID>
<VocID>AF05E961-9BC3-4249-A4A7-C6146D6FC614</VocID>
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
<ProductDescription>
<ProductID>2</ProductID>
<ProductName>Road Bike2</ProductName>
<GenID>D1DCAD29-08C6-401E-9A0A-2130DC5D8CD4</GenID>
<VocID>AF05E961-9BC3-4249-A4A7-C6146D6FC614</VocID>
<Features>
  <Warranty>2 year parts and labor</Warranty>
  <Maintenance>4 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'
SET @ProdID =  @myDoc.value('(/Root/ProductDescription/ProductID)[2]', 'int' )
SELECT @ProdID

这将为我提供第二项的ID。如果我改变 我有GenIDVocID。使用它我需要查询并获取其他数据。 请帮我生成相同的查询。我正在使用SQL Server 2012.提前感谢。

1 个答案:

答案 0 :(得分:2)

我会直接从XML数据中选择,只需将您选择的项目编号移动到nodes,而不是选择ID,然后按该ID进行过滤。这样你就可以访问其他信息了。

E.g。

SELECT  ProductID = x.value('ProductID[1]', 'int'),
        ProductName = x.value('ProductName[1]', 'varchar(100)'),
        GenID = x.value('GenID[1]', 'uniqueidentifier')
FROM    @myDoc.nodes('/Root/ProductDescription[2]') prod (x);

修改

要获取与给定GenID和VocID匹配的记录,您可以使用exist()方法:

DECLARE @VocID UNIQUEIDENTIFIER = 'AF05E961-9BC3-4249-A4A7-C6146D6FC614',
        @GenID UNIQUEIDENTIFIER = 'D1DCAD29-08C6-401E-9A0A-2130DC5D8CD4';

SELECT  ProductID = x.value('ProductID[1]', 'int'),
        ProductName = x.value('ProductName[1]', 'varchar(100)'),
        GenID = x.value('GenID[1]', 'uniqueidentifier')
FROM    @myDoc.nodes('/Root/ProductDescription') prod (x)
WHERE   x.exist('VocID[text() = sql:variable("@VocID")]') = 1
AND     x.exist('GenID[text() = sql:variable("@GenID")]') = 1;