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

Откуда:
Сообщений: 828
Доброго всем дня.

Подскажите, как пронумеровать строки, получающиеся при применении функции nodes() к XML-переменной? Нумерация должна соответствовать физическому порядку элементов в XML.
18 ноя 13, 11:35    [15146898]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
а просто row_number не подойдёт?
declare @xml xml
set @xml = '<root><node>3</node><node>1</node><node>2</node></root>'

select c.value('text()[1]','int')
,ROW_NUMBER()OVER(order by (select 1)) as N
from @xml.nodes('//node') t(c)
18 ноя 13, 12:22    [15147188]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Алексей Колодезный
Member

Откуда:
Сообщений: 86
В общем виде никак. SQL сервер может порядок строк менять как ему удобнее будет. Самое правильное нужный номер по порядку в XML одним из атрибутов передавать
18 ноя 13, 12:25    [15147218]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Antoshka,

Можно, но производительность вас вряд ли устроит: https://www.sql.ru/forum/646824/kak-uznat-poryadkovyy-nomer-xml-nody
18 ноя 13, 12:27    [15147229]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Antoshka
Member

Откуда:
Сообщений: 828
LexusR
а просто row_number не подойдёт?

Увы, нет, он нумерует по своему разумению. Я бы добавил номер, да вот XML выдаётся из системы одного монополиста.
18 ноя 13, 12:36    [15147315]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Exproment
Member

Откуда:
Сообщений: 416
Antoshka, скорей всего вам и не нужно его нумеровать. Сам несколько раз сталкивался с такой проблемой. В итоге все решал отказавшись от этой идеи
18 ноя 13, 13:41    [15147882]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Antoshka
Member

Откуда:
Сообщений: 828
Exproment
Antoshka, скорей всего вам и не нужно его нумеровать. Сам несколько раз сталкивался с такой проблемой. В итоге все решал отказавшись от этой идеи

В моём XML содержится маршрут следования вагона, заданный перечнем станций. Порядок прохождения этих станций соответствует порядку расположения узлов в XML-документе.
18 ноя 13, 15:02    [15148717]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31981
Antoshka
Подскажите, как пронумеровать строки, получающиеся при применении функции nodes() к XML-переменной? Нумерация должна соответствовать физическому порядку элементов в XML.
Я в такой ситуации вставлял XMLBulk в таблицу с IDENTITY

Можно ещё преобразовывать через XSLT, добавляя порядковый номер.
18 ноя 13, 15:50    [15149141]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Exproment
Member

Откуда:
Сообщений: 416
Можно пронумеровать xml'ку как-то так:

declare @xml xml
set @xml = '<root>
				<node>3</node>
				<node>1</node>
				<node>2</node>
			</root>'
	
select @xml.query('	for $a in /root/node
						let $l := count($a/parent::root/node[. << $a]) + 1
					return <node OrderID = "{$l}">
								{ data($a) }
							</node>')


Оказывается XQuery в sql server поддерживает операторы сравнения порядка узлов(тынц). Учитывая это можно очень даже неплохо извернуться. Приведенное решение надо доработать исходя из требований автора. Может даже прямо в value можно что-то подобное сотворить.
18 ноя 13, 17:42    [15150131]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Exproment
Member

Откуда:
Сообщений: 416
alexeyvg
Можно ещё преобразовывать через XSLT, добавляя порядковый номер.

Кстати sql server разве поддерживает XSLT преобразования ?
18 ноя 13, 17:44    [15150140]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
В качестве бреда после напряженного рабочего дня:
declare @x xml = '<root><item>a</item><item>b</item><item>c</item></root>';

with x as
(
 select
  1 as id, t.n.query('.') as x
 from
  @x.nodes('/root/item[1]') t(n)

 union all

 select
  id + 1, t.n.query('.')
 from
  x cross apply
  @x.nodes('/root/item[sql:column("x.id") + 1]') t(n)
)
select
 *
from
 x ;
18 ноя 13, 18:30    [15150403]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31981
Exproment
alexeyvg
Можно ещё преобразовывать через XSLT, добавляя порядковый номер.

Кстати sql server разве поддерживает XSLT преобразования ?
Ну, в SSIS поддерживает. Да и отдельно преобразование можно сделать.
18 ноя 13, 18:38    [15150439]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Antoshka
Member

Откуда:
Сообщений: 828
15147229 помогло. Производительности на моих объёмах хватает
26 ноя 13, 10:05    [15189573]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация строк в XML, полученных из nodes()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm, интересно то, что в CTE встроен логический счётчик (от 0), но им невозможно воспользоваться.
Во всяком случае наблюдается на некоторых версиях - хотя противоречит тому что знал о CTE несколько лет назад ...

Только это "теоретически может по разному выводить" - выкиньте, и не парьте мозг. CTE с for - высер. имхо.
Там обычный прямоточный SAX парсер. Что-то поменять - зарубить производительность на корню.
Вы же не будете что-то нагораживать с этом XML. Тупо загрузить.

автор
Самое правильное нужный номер по порядку в XML одним из атрибутов передавать
В стандарте XML всё чётко задаётся. Проблемы SQL это проблемы SQL.
27 ноя 13, 06:56    [15195981]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить