Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите с xml  [new]
Диам
Member

Откуда:
Сообщений: 1497
Здравствуйте.
В таблице "KI_export" есть поле "xmldata" с типом xml и ключ keyRec (int)
В поле xmldata хранится вот такой xml:

<fch version="3.0">
  <head>
    <date>15.09.2014</date>
  </head>
  <info recnumber="1">
    <title_part>
      <number>103842</number>
      <type>0</type>
      <private>
        <lastname>Иванов</lastname>
     </private>
    </title_part>
  </info>
<fch>


Подскажите, как мне для записи с keyRec = 38 вытащить нод <info> у которого number = 103842
15 сен 14, 17:45    [16577734]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+
declare
@x1 xml = 
N'
<fch version="3.0">
  <head>
    <date>15.09.2014</date>
  </head>
  <info recnumber="1">
    <title_part>
      <number>777</number>
      <type>0</type>
      <private>
        <lastname>Иванов</lastname>
     </private>
    </title_part>
  </info>
</fch>
',
@x2 xml = 
N'
<fch version="3.0">
  <head>
    <date>15.09.2014</date>
  </head>
  <info recnumber="1">
    <title_part>
      <number>555</number>
      <type>0</type>
      <private>
        <lastname>Иванов</lastname>
     </private>
    </title_part>
  </info>
</fch>
',
@x3 xml = 
N'
<fch version="3.0">
  <head>
    <date>15.09.2014</date>
  </head>
  <info recnumber="1">
    <title_part>
      <number>103842</number>
      <type>0</type>
      <private>
        <lastname>Иванов</lastname>
     </private>
    </title_part>
  </info>
</fch>
',
@num int = 103842;

with t0(id, xn) as
(
	select 1, @x1 union all
	select 2, @x2 union all
	select 3, @x3
)
select
	id,
	xn.query('/fch/info')
from
	t0
where
	xn.exist('//number[text()[1] eq sql:variable("@num")]') = 1;
15 сен 14, 18:00    [16577805]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
не забудьте про xml index'ы по ним можно и //node/node...
15 сен 14, 18:01    [16577811]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
При полностью расписанном пути и XML индексе (FOR PATH) должны работать быстрее

with t0(id, xn) as
(
	select 1, @x1 union all
	select 2, @x2 union all
	select 3, @x3
)
select
	id,
	xn.query('/fch/info')
from
	t0
where
	xn.exist('/fch/info/title_part/number[text()[1] eq sql:variable("@num")]') = 1;
15 сен 14, 18:29    [16577942]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
Диам
Member

Откуда:
Сообщений: 1497
Спасибо большое. Работает.
Подскажите еще такой момент. Я пытался сделать конструкцию по аналогии с 16448079
Вот что у меня получилось, но это не работает:
SELECT K.xmldata.query(            
	'for $A in fch/*
	where $A/info/title_part/number[1] = 103842
	return $A'	
	) Res
FROM KI_export K WHERE keyRec=58


почему, что не так?
И еще - если мне надо найти соответствие текстовое, то как мне этот текст в хмл прописать - просто в двойных кавычках?
16 сен 14, 11:37    [16579871]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
Диам
Member

Откуда:
Сообщений: 1497
Поторопился я с определением правильности.
churupaha, вы приводите пример, когда среди множества хмл (несколько записей в таблице) находится именно тот, в котором присутствует нужный мне ключ.

Но у меня ситуация, когда в одном хмл (в одной конкретной записи), есть много нодов <info> и мне надо вытащить только тот нод, у которого <number> = 103842

Как такое сделать?
16 сен 14, 11:48    [16579934]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
Диам
Member

Откуда:
Сообщений: 1497
Методом научного тыка нашел таки решение и ответ на предыдущий вопрос про текстовое значение:
SELECT K.xmldata.query('(fch/info[title_part/number="103842"])') AS Res 
FROM KI_export K 
WHERE K.keyRec=53
16 сен 14, 12:05    [16580070]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
Диам
Но у меня ситуация, когда в одном хмл (в одной конкретной записи), есть много нодов <info> и мне надо вытащить только тот нод, у которого <number> = 103842

Как такое сделать?
declare @x xml = N'<fch version="3.0">
  <head>
    <date>15.09.2014</date>
  </head>
  <info recnumber="1">
    <title_part>
      <number>555</number>
      <type>0</type>
      <private>
        <lastname>Иванов</lastname>
     </private>
    </title_part>
  </info>
  <info recnumber="1">
    <title_part>
      <number>666</number>
      <type>0</type>
      <private>
        <lastname>Иванов</lastname>
     </private>
    </title_part>
  </info>
  <info recnumber="1">
    <title_part>
      <number>777</number>
      <type>0</type>
      <private>
        <lastname>Иванов</lastname>
     </private>
    </title_part>
  </info>
</fch>';

declare @t table (id int, x xml);
insert into @t values (1, @x);

select
 n.query('.')
from
 @t t cross apply
 t.x.nodes('/fch/info[title_part/number = "555"]') a(n);
16 сен 14, 12:10    [16580104]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
или сразу
 x.query('(/fch/info[title_part/number = "555"])[1]')
16 сен 14, 12:14    [16580144]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
a_voronin
При полностью расписанном пути и XML индексе (FOR PATH) должны работать быстрее


Path from each node to the root of the XML tree. This column is searched for path expressions in the query.
...
Also, paths are stored in reverse order to allow matching paths when only the path suffix is known.
...


тынц

Также если под DAC залезть и через sys.internal_tables вытянуть таблицу Pirmary XML индекса там эту картину можно наблюдать.

Не факт что быстрее - тестить надо. :)
16 сен 14, 12:19    [16580201]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с xml  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Диам
Вот что у меня получилось, но это не работает:
SELECT K.xmldata.query(            
	'for $A in fch/*
	where $A/info/title_part/number[1] = 103842
	return $A'	
	) Res
FROM KI_export K WHERE keyRec=58




Я думаю надо вот так

number[text()[1] eq sql:variable("@num")]
16 сен 14, 12:48    [16580425]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить