下面是我的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。如果我改变
我有GenID
和VocID
。使用它我需要查询并获取其他数据。
请帮我生成相同的查询。我正在使用SQL Server 2012.提前感谢。
答案 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;