2016-04-28 126 views
2

對於SQL查詢中的用法,我需要獲取特定XML元素的值。 XML元素由其屬性指定。SQL Server:如何獲取指定屬性的XML元素的值?

我的XML元素看起來是這樣的:

<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations> 

,當我指定郎是「EN-US」我正在尋找的價值將是「榜樣」。

我找到了一種方法,通過使用query()函數和之後的value()函數來獲取此值。

declare @S varchar(max) 

set @S = 
'<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations>' 

declare @X xml 

set @X = CAST(@S as xml) 

select @X.query('/translations/value[@lang="en-US"]').value('.','varchar(max)') 

這個select語句通過使用query()和value()函數返回值「example」。但是,是否還有一種更方便的方法來僅使用value()或query()?

預先感謝您!

回答

1

肯定有...

您也可以縮短聲明:

declare @X xml= 
'<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations>'; 

select @X.value('(/translations/value[@lang="en-US"])[1]','varchar(max)'); 

的一點是,你需要一個結果當您使用.value()。通過將XPath設置爲假設並強制第一個元素被採用(在這種情況下,它是唯一的元素),可以實現此目的。

順便說一句:如果你需要這個(遲早你會需要這個......),你可以把「EN-US」作爲參數傳入您的查詢是這樣的:

declare @prm VARCHAR(10)='en_US'; 
select @X.value('(/translations/value[@lang=sql:variable("@prm")])[1]','varchar(max)'); 

你可以達到類似,但使用sql:column()的實際查詢值。

+0

非常感謝!對我來說這是一個巨大的進步! – bert