#sql-server #xml #sql-server-2012
#sql-сервер #xml #sql-server-2012
Вопрос:
У меня есть следующий XML, который хранится в столбце xml в таблице SQL Server 2012.
<Values>
<V ID="MyValue1" Value="True" />
<V ID="MyValue2" Value="False" />
</Values>
Я пытаюсь получить Value
от узла с идентификатором «MyValue1» в качестве логического значения из XML. После небольшого поиска и некоторых ошибок SQL xml я закончил с этим:
SELECT ID, [Values],
[Values].value('data(/Values/V[@ID="MyValue1"]/@Value)[1]', 'bit') AS MyBool
FROM [MyXmlValues]
Это кажется немного безумным. Нет ли более простого способа (например, без части данных) запросить одно значение через XPath?
Большинство вопросов и примеров в StackOverflow используют [1] для указания узла, но я не могу быть уверен, что мой узел является первым, что следует ожидать в XML.
Комментарии:
1. Нет, для этого нет «ярлыка» или чего-либо еще — это способ «проникнуть» в структуру XML и извлечь значение одного узла
Ответ №1:
Вам не нужно data()
. Вы можете использовать
(/Values/V[@ID="MyValue2"]/@Value)[1]'
если вы ожидаете, что больше узлов будут иметь идентификатор, который вы ищете, и Хотите получить их первое значение атрибута (т. Е. Значение атрибута из первого узла, который имеет этот атрибут или
(/Values/V[@ID="MyValue2"])[1]/@Value'
если вы хотите выбрать первый узел, у которого есть идентификатор, и получить значение его атрибута, независимо от того, установлено оно или нет.
Если идентификатор может быть только у одного узла, что кажется разумным, разницы нет.