2017-05-08 82 views
1

我试图查询XML类型的XML字段,以便在存储过程中进行。已知属性“x”的属性“y”的T-SQL XQuery值

该字段具有多个具有相同名称的元素,并且每个元素具有多个属性。查询需要返回c的值,其中r(该字段中的唯一值)的值是已知的。 例如。在属性r“FGH”的值下面的XML字段中返回属性值c。每个r的值都是唯一的,所以只返回一行。

<Assets> 
    <Cars> 
     <Car r="ABC" c="Nissan" t="petrol"/> 
     <Car r="FGH" c="VW" t="petrol"/> 
     <Car r="XYZ" c="Mini" t="diesel"/> 
    </Cars> 
</Assets> 

我试图查询的删节版本是:

USE MyDB 

DECLARE   
@ASSETS XML = null, 
@car nvarchar(50) 

SELECT @ASSETS = ASSETS FROM MyTable WHERE ID = 26800 
SELECT @car = @ASSETS.value('(//*/*/@FGH', 'nvarchar(max)') ; 

我可以看到这是不对的,但完全被卡住。

回答

3

因此,您需要具有r属性值FGH的元素(任何名称)上的c属性的值。你想要的XPath是:

//*[@r='FGH']/@c 

取决于你如何获得价值了,你可能需要明确获得一个单值。例如:

DECLARE @xml xml = '<Assets> 
    <Cars> 
     <Car r="ABC" c="Nissan" t="petrol"/> 
     <Car r="FGH" c="VW" t="petrol"/> 
     <Car r="XYZ" c="Mini" t="diesel"/> 
    </Cars> 
</Assets> 
'; 

SELECT @xml.value('(//*[@r="FGH"]/@c)[1]', 'nvarchar(max)'); 

结果:

---------------------- 
VW 

(1 row(s) affected) 

( )[1]是说服你得到一个值的SQL Server。

+0

谢谢@AakashM。完善。 – bjh