2017-05-08 37 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