Разбор / запрос XML с использованием TSQL - PullRequest
3 голосов
/ 13 января 2012

Я боролся с этим некоторое время, кажется, я близок, но не совсем там. У меня есть столбец в базе данных, который выглядит следующим образом:

<document>
<items>
<item name="one">one is the first number</item>
<item name="two">two is the second number</item>
</items>
</document>

В этом примере мне нужно запросить и вернуть «два - второе число». Я также хотел бы сделать это без создания временной таблицы. В настоящее время у меня есть:

create table #test (item1 xml)
insert into #test (item1) 
values ('<document> <items> <item name="one">one is the first number</item> <item name="two">two is the second number</item> </items> </document>')

select item1.value('(/document/items/item)[2]', 'nvarchar(max)') from #test
select item1.query('/document/items/item[@name="two"]') from #test

Первый выбор возвращает правильное значение, но мне нужно знать, что это второй «индекс» Вторая возвращает то, что я хочу, но возвращает весь узел два ..

Чего мне не хватает? И есть ли простой способ использовать XML без преобразования во временную таблицу?

Ответы [ 2 ]

6 голосов
/ 13 января 2012

Я также хотел бы сделать это без создания временной таблицы

Вы можете использовать переменную с типом данных XML.

declare @xml xml

set @xml = 
'<document>
  <items>
    <item name="one">one is the first number</item>
    <item name="two">two is the second number</item>
  </items>
</document>'

select @xml.value('(/document/items/item[@name="two"])[1]', 'nvarchar(max)')

Или вы можете привестиВаша строка в запросе XML.

select cast(
            '<document>
              <items>
                <item name="one">one is the first number</item>
                <item name="two">two is the second number</item>
              </items>
            </document>' as xml
           ).value('(/document/items/item[@name="two"])[1]', 'nvarchar(max)')

Ваш первый запрос использует .value(), что правильно, а ваш второй запрос имеет правильное выражение XQuery.При использовании .value() вам необходимо использовать выражение XQuery, которое возвращает одно значение.Это даст вам все узлы предметов, где @name - это два /document/items/item[@name="two"]).Добавление [1] в конце гарантирует, что вы получите только первое вхождение в XML, где @name равно двум.

0 голосов
/ 13 января 2012

(Во-первых, вместо временной таблицы вы можете использовать переменную типа xml, как я делаю ниже. Такие переменные могут быть назначены непосредственно из строковых литералов)

Так что я думаю, что вы имеете в виду, что вам нужно текстовое значение узла item с name two, и в этом случае вам просто нужно включить соответствующее условие в xpath, который вы используете при вызове value():

DECLARE @x xml

SET @x = '<document> <items> <item name="one">one is the first number</item> 
     <item name="two">two is the second number</item> </items> </document>'

SELECT @x.value('(/document/items/item[@name="two"])[1]', 'nvarchar(max)')

дает

--------------------------------------------------------------
two is the second number

(1 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...