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

запрос для вытаскивания из иерархического xml уникальных идентификаторов выглядит так:
;with cte as(
	select
		  n.value('@type', 'sysname') as type
		, n.value('@id', 'int') as id
		, n.query('*') as xml
	from @xml.nodes('*') T(n)
	union all
	select
		  n.value('@type', 'sysname') as type
		, n.value('@id', 'int') as id
		, n.query('*') as xml
	from cte cross apply cte.xml.nodes('*') T(n)
)
select id
from cte
where type = 'field'
group by type, id
Использовать его необходимо в триггере, для проверки валидности xml.
Не могу сообразить, можно ли одним запросом вытаскивать эти id-ки и ссылки на записи, или придется циклом пройтись по каждой. Грубо говоря:
из
1 '<item ... id=1 ... id=2 ... id=2 ... id=3 ... id=1 ... </item>'
2 '<item ... id=7 ... id=2 ... id=7 ... id=3 ... id=7 ... </item>'

получить:
11
12
13
27
22
23
26 май 09, 12:44    [7227889]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивный запрос по xml для каждой строки выборки  [new]
Ё-МАЙО
Guest
Ё-МАЙО
можно ли одним запросом вытаскивать эти id-ки и ссылки на записи, или придется циклом пройтись по каждой
только udf + apply?
26 май 09, 12:48    [7227931]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивный запрос по xml для каждой строки выборки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

что-то не очень понятно. ни смысл вашего запроса, ни
что получить хотите. может, поподробнее как-то?

Posted via ActualForum NNTP Server 1.4

26 май 09, 12:56    [7228000]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивный запрос по xml для каждой строки выборки  [new]
Ё-МАЙО
Guest
есть
+ исходная простыня:

declare @mapping_filters table ( id_parser int not null, condition xml not null )

insert into @mapping_filters( id_parser, condition )
select 1, '<item type="operation" name="and">
  <item type="operation" name="notlike">
    <item type="field" id="15" name="URI" />
    <item type="value"><![CDATA[*.gif]]></item>
  </item>
  <item type="operation" name="notlike">
    <item type="field" id="15" name="URI" />
    <item type="value"><![CDATA[*.jpg]]></item>
  </item>
  <item type="operation" name="notlike">
    <item type="field" id="15" name="URI" />
    <item type="value"><![CDATA[*.jpeg]]></item>
  </item>
  <item type="operation" name="notlike">
    <item type="field" id="15" name="URI" />
    <item type="value"><![CDATA[*.png]]></item>
  </item>
  <item type="operation" name="notlike">
    <item type="field" id="15" name="URI" />
    <item type="value"><![CDATA[*.bmp]]></item>
  </item>
  <item type="operation" name="notlike">
    <item type="field" id="15" name="URI" />
    <item type="value"><![CDATA[*.css]]></item>
  </item>
  <item type="operation" name="and">
    <item type="operation" name="or">
      <item type="operation" name="noteq">
        <item type="field" id="20" name="from_net" />
        <item type="value"><![CDATA[Internal]]></item>
      </item>
      <item type="operation" name="noteq">
        <item type="field" id="21" name="to_net" />
        <item type="value"><![CDATA[Internal]]></item>
      </item>
    </item>
    <item type="operation" name="or">
      <item type="operation" name="noteq">
        <item type="field" id="21" name="from_net" />
        <item type="value"><![CDATA[Local Host]]></item>
      </item>
      <item type="operation" name="noteq">
        <item type="field" id="22" name="to_net" />
        <item type="value"><![CDATA[Local Host]]></item>
      </item>
    </item>
    <item type="operation" name="or">
      <item type="operation" name="noteq">
        <item type="field" id="20" name="from_net" />
        <item type="value"><![CDATA[Local Host]]></item>
      </item>
      <item type="operation" name="noteq">
        <item type="field" id="21" name="to_net" />
        <item type="value"><![CDATA[Internal]]></item>
      </item>
    </item>
    <item type="operation" name="or">
      <item type="operation" name="noteq">
        <item type="field" id="20" name="from_net" />
        <item type="value"><![CDATA[Internal]]></item>
      </item>
      <item type="operation" name="noteq">
        <item type="field" id="21" name="to_net" />
        <item type="value"><![CDATA[Local Host]]></item>
      </item>
    </item>
  </item>
</item>'
union all
select 2, '<item type="operation" name="and">
  <item type="operation" name="noteq">
    <item type="field" id="9" name="action" />
    <item type="value" dbType="String"><![CDATA[Establish]]></item>
  </item>
  <item type="operation" name="and">
    <item type="operation" name="or">
      <item type="operation" name="noteq">
        <item type="field" id="7" name="source_net" />
        <item type="value" dbType="String"><![CDATA[Internal]]></item>
      </item>
      <item type="operation" name="noteq">
        <item type="field" id="8" name="dest_net" />
        <item type="value" dbType="String"><![CDATA[Internal]]></item>
      </item>
    </item>
    <item type="operation" name="or">
      <item type="operation" name="noteq">
        <item type="field" id="7" name="source_net" />
        <item type="value" dbType="String"><![CDATA[Local Host]]></item>
      </item>
      <item type="operation" name="noteq">
        <item type="field" id="8" name="dest_net" />
        <item type="value" dbType="String"><![CDATA[Local Host]]></item>
      </item>
    </item>
    <item type="operation" name="or">
      <item type="operation" name="noteq">
        <item type="field" id="7" name="source_net" />
        <item type="value" dbType="String"><![CDATA[Local Host]]></item>
      </item>
      <item type="operation" name="noteq">
        <item type="field" id="8" name="dest_net" />
        <item type="value" dbType="String"><![CDATA[Internal]]></item>
      </item>
    </item>
    <item type="operation" name="or">
      <item type="operation" name="noteq">
        <item type="field" id="7" name="source_net" />
        <item type="value" dbType="String"><![CDATA[Internal]]></item>
      </item>
      <item type="operation" name="noteq">
        <item type="field" id="8" name="dest_net" />
        <item type="value" dbType="String"><![CDATA[Local Host]]></item>
      </item>
    </item>
  </item>
</item>'


необходимо получить:
17
18
19
215
220
221
221
222
26 май 09, 13:22    [7228205]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивный запрос по xml для каждой строки выборки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> есть
> + исходная простыня:

нет, ну, если буквально понять, то так:
select distinct id_parser, t.c.value('.', 'int')
from @mapping_filters
   cross apply condition.nodes('//@id') t(c)

?

Posted via ActualForum NNTP Server 1.4

26 май 09, 13:38    [7228340]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивный запрос по xml для каждой строки выборки  [new]
Ё-МАЙО
Guest
снимаю шляпу
26 май 09, 13:49    [7228462]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивный запрос по xml для каждой строки выборки  [new]
Ё-МАЙО
Guest
daw, в конкретном случае, допустимо делать проверку по id без учета type
но в общем случае это некорректно. подскажите, как действовать, если придется делать проверку по type?
списибо
26 май 09, 15:32    [7229419]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивный запрос по xml для каждой строки выборки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> daw, в конкретном случае, допустимо делать проверку по id без учета type
> но в общем случае это некорректно. подскажите, как действовать, если
> придется делать проверку по type?
> списибо

так?
select distinct id_parser, t.c.value('@id', 'int')
from @mapping_filters
   cross apply condition.nodes('//item[@type="field"]') t(c)

Posted via ActualForum NNTP Server 1.4

26 май 09, 15:42    [7229510]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивный запрос по xml для каждой строки выборки  [new]
Ё-МАЙО
Guest
похоже)
ушел учить XQuery
26 май 09, 16:29    [7229996]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить