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

Откуда: Київ
Сообщений: 10428
В таблице есть поле хмл, в котором может быть 0-N тегов file, причем в разных местах иерархии.

Как здесь вытащить список id, filename?
при том, что у одного ида может быть 0-N файлов
Т.е. нужен результат такой в данном примере:
------------
1 c:\temp\f1.txt
1 c:\temp\f2.txt
2 c:\temp\f3.txt
2 c:\temp\f4.txt
2 c:\temp\f5.txt

declare @t1 table
(	id int,
	x XML
)

insert into @t1 (id, x)
select 1,N'<root name="name" id="12">
<class1>
<file value="c:\temp\f1.txt"/>
</class1>
<class1>
<subclass1>
<file value="c:\temp\f2.txt"/>
</subclass1>
</class1>
</root>'
union 
select 2,N'<root name="name" id="12">
<class1>
<file value="c:\temp\f3.txt"/>
</class1>
<class1>
<subclass1>
   <file value="c:\temp\f4.txt"/>
   <subclass11>
      <file value="c:\temp\f5.txt"/>
   </subclass11>
</subclass1>
</class1>
</root>'
6 ноя 12, 13:33    [13426296]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
нязнайка
Guest
SELECT c.value(N'@value', N'nvarchar(max)')
FROM @a.nodes('*//file') t(c)
6 ноя 12, 13:38    [13426347]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
нязнайка
Guest
SELECT c.value(N'@value', N'nvarchar(max)')
FROM @t1 AS  d 
CROSS APPLY x.nodes(N'*//file') AS t(c)
6 ноя 12, 13:41    [13426361]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
нязнайка
SELECT c.value(N'@value', N'nvarchar(max)')
FROM @a.nodes('*//file') t(c)


как из таблицы выбрать? (см. пример)
6 ноя 12, 13:42    [13426370]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
нязнайка
SELECT c.value(N'@value', N'nvarchar(max)')
FROM @t1 AS  d 
CROSS APPLY x.nodes(N'*//file') AS t(c)




спасибо.
6 ноя 12, 13:43    [13426378]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
усугублю пример....

все так же, но в таблице поле не xml, хотя разбирать его надо как хмл

вот так

declare @t1 table
(	id int,
	x nvarcahr(MAX)  ------------- <--- изменил
)
insert into @t1 (id, x)
select 1,N'<root name="name" id="12">
<class1>
<file value="c:\temp\f1.txt"/>
</class1>
<class1>
<subclass1>
<file value="c:\temp\f2.txt"/>
</subclass1>
</class1>
</root>'
union 
select 2,N'<root name="name" id="12">
<class1>
<file value="c:\temp\f3.txt"/>
</class1>
<class1>
<subclass1>
   <file value="c:\temp\f4.txt"/>
   <subclass11>
      <file value="c:\temp\f5.txt"/>
   </subclass11>
</subclass1>
</class1>
</root>'
6 ноя 12, 13:49    [13426420]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
все так же, но в таблице поле не xml, хотя разбирать его надо как хмл

Функция CAST/CPNVERT ? Нет, не слышал
6 ноя 12, 13:51    [13426430]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
все так же, но в таблице поле не xml, хотя разбирать его надо как хмл

Функция CAST/CPNVERT ? Нет, не слышал


Жесткий ответ, как шашкой....

о CPNVERT - нет, не слышал
6 ноя 12, 13:54    [13426443]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
усугублённый пример, как вытащить имена файлов из такого хмл

т.е. имя файла только в параметр VALUE, если он находится в теге
<Object NAME="File">
...
</Object>


а сам этот тег может быть в разных поддеревьях


declare @t1 table
(   id int,
   x XML
)

insert into @t1 (id, x)
select 1,N'<root name="name" id="12">
<class1>
  <Object NAME="File">
              <Parameter ID="1" NAME="Name" VALUE="\\mysvr\fiels\readme1.txt" />
   </Object>
</class1>
<class1>
<subclass1>
<Object NAME="File">
              <Parameter ID="10" NAME="Name" VALUE="\\mysvr\fiels\readme2.txt" />
</Object>
<Object NAME="bitmap">
              <Parameter ID="11" NAME="my1" VALUE="bmp" />
</Object>
</subclass1>
</class1>
</root>'
union 
select 2,N'<root name="name" id="12">
<class1>
  <Object NAME="File">
              <Parameter ID="13" NAME="Name" VALUE="\\mysvr\fiels\readme3.txt" />
  </Object>
  <Object NAME="Font">
              <Parameter ID="22" NAME="Tahoma" VALUE="11" />
  </Object>
</class1>
<class1>
<subclass1>
  <Object NAME="File">
              <Parameter ID="14" NAME="Name" VALUE="\\mysvr\fiels\readme4.txt" />
  </Object>
</subclass1>
</class1>
</root>'
6 ноя 12, 15:18    [13427105]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Winnipuh,

+ Как-то так

select  t.ID
      , z.z.query('.')
      , z.z.value('(Parameter/@VALUE)[1]', 'varchar(150)')
from    @t1 t
cross apply t.x.nodes('//*[@NAME="File"]') z ( z )

6 ноя 12, 16:16    [13427731]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать эелементы из поля типа XML?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
denis2710
Winnipuh,

+
+ Как-то так

select  t.ID
      , z.z.query('.')
      , z.z.value('(Parameter/@VALUE)[1]', 'varchar(150)')
from    @t1 t
cross apply t.x.nodes('//*[@NAME="File"]') z ( z )



красиво! спасибо, то, что надо!
6 ноя 12, 16:25    [13427862]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить