2016-04-28 2 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)') 

Этот оператор выбора возвращает значение «пример» я ищу с помощью запроса() и значение функции(). Но есть ли еще более удобный способ использовать value() OR 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 в paranthesis и принудительно взяв первый элемент (в этом случае это единственный элемент).

Btw: Если вам это нужно (и рано или поздно вы будете нуждаться в этом ...), вы можете поставить «EN-US» в качестве параметра в запросе, как это:

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

Вы можете достичь аналогичного, но со значением фактического запроса, используя sql:column().

+0

Большое спасибо! Это огромное улучшение для меня! – bert