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

Откуда:
Сообщений: 1214
А тут гарантия какая? Ссылка на доку есть?
10 окт 14, 15:59    [16688058]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
Glory
Возьмите edge формат тогда


ORDER BY Clause (Transact-SQL)

SQL Server 2014 Other Versions 1 out of 1 rated this helpful - Rate this topic
Sorts data returned by a query in SQL Server. Use this clause to:
Order the result set of a query by the specified column list and, optionally, limit the rows returned to a specified range. The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.

На самом деле такое утверждение есть в ANSI SQL.
10 окт 14, 16:28    [16688195]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.

А какое отношение ORDER BY имеет к внутренностям функции OPENXML ? Или к парсеру xml ?
И если вы не заметели, то у edge таблицы уже проставлены id.

Сообщение было отредактировано: 10 окт 14, 16:31
10 окт 14, 16:30    [16688201]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9161
Кстати, OPENXML - это вариант, он использует DOM и обходит узлы наверняка последовательно.
10 окт 14, 16:41    [16688264]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Glory
И если вы не заметели, то у edge таблицы уже проставлены id.


строго говоря, никто не обещал, что они в порядке следования нод в xml проставляются, сказано только что у рута id = 0 и они уникальны. хотя, иное было бы странным.
10 окт 14, 16:47    [16688311]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Glory
Member

Откуда:
Сообщений: 104751
daw
Glory
И если вы не заметели, то у edge таблицы уже проставлены id.


строго говоря, никто не обещал, что они в порядке следования нод в xml проставляются, сказано только что у рута id = 0 и они уникальны. хотя, иное было бы странным.

А где гарантия того, что X.R.value('count(for $s in /data/row where $s << . return("1"))', 'int') что-то делает в порядке следования нод ?

OPENXML по крайней мере возвращает вам подтверждение своего порядка обхода нод
10 окт 14, 16:51    [16688346]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Glory
А где гарантия того, что X.R.value('count(for $s in /data/row where $s << . return("1"))', 'int') что-то делает в порядке следования нод ?


как это, где? << - это оператор, который именно проверяет порядок следования нод.
10 окт 14, 16:57    [16688389]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Glory
Member

Откуда:
Сообщений: 104751
daw
<< - это оператор, который именно проверяет порядок следования нод.

И каков этот порядок ? Он всегда соответствует следованию нод ?
10 окт 14, 16:59    [16688401]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
Вообще ни один парсер не гарантирует порядка следования одинаковых DOM-узлов на одном уровне иерархии, который бы полностью соотвествовал порядку аналогов этих узлов в разметке. Это касается и DOM-парсера, и OPENXML, и всего прочего. Здесь остается только опираться на эмпирику. Я на своем опыте, например, не сталкивался с тем, что nodes смешивает порядок узлов. Кто-то аналогичное может сказать про OPENXML.
И вопрос к ТС: чем так важен этот порядок? В отсутствие признака, определяющего упорядоченность, требовать эту упорядоченность - то же самое, что требовать упорядоченности у SELECT без ORDER BY.
10 окт 14, 16:59    [16688403]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
Glory
a_voronin
The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.

А какое отношение ORDER BY имеет к внутренностям функции OPENXML ? Или к парсеру xml ?
И если вы не заметели, то у edge таблицы уже проставлены id.


Такое, что в запросе

SELECT * FROM OPENXML(@docHandle, N'/data/row')


ORDER BY отсутствует, а это значит, что по документации Microsoft и ANSI SQL, порядок строк не гарантирован.
10 окт 14, 16:59    [16688404]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
Такое, что в запросе

SELECT * FROM OPENXML(@docHandle, N'/data/row')



ORDER BY отсутствует, а это значит, что по документации Microsoft и ANSI SQL, порядок строк не гарантирован.

И что с того, что ORDER BY отсутствует?
Выходной набор уже содержит нумерацию
10 окт 14, 17:00    [16688414]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Glory
daw
<< - это оператор, который именно проверяет порядок следования нод.

И каков этот порядок ? Он всегда соответствует следованию нод ?


ну, вот вам из документации:

http://msdn.microsoft.com/en-us/library/ms190935.aspx

Node Order Comparison Operators

--------------------------------------------------------------------------------

Node order comparison operators compare pairs of nodes, based on their positions in a document.

These are the comparisons that are made, based on document order:

<< : Does operand 1 precede operand 2 in the document order.




что-то не так?
10 окт 14, 17:01    [16688421]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Glory
Member

Откуда:
Сообщений: 104751
daw
что-то не так?

Это вы пытаетесь сказать, что что-то не так
Я ничего "не так" не вижу.
10 окт 14, 17:03    [16688444]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
то есть, это именно порядок расположения нод в документе, не обхода их, если вы об этом.
10 окт 14, 17:04    [16688449]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
daw
Member

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

Это вы пытаетесь сказать, что что-то не так
Я ничего "не так" не вижу.


покажите мне, где в документации сказано, что id в edge table идут в порядке расположения нод в документе, и я тогда перестану видеть, что "не так".
10 окт 14, 17:07    [16688467]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
Glory
daw
что-то не так?

Это вы пытаетесь сказать, что что-то не так
Я ничего "не так" не вижу.


На уровне DOM или .NET порядок гарантирован. XMLDocument в .NET порядок нодов гарантирован, в XMLReader гарантирован. Просто люди, которые создавали эти XML не подумали о специфике работы с ними на уровне БД.

Но как только результат работы этих библиотек проходит через оператор SELECT эта гарантия снимается. Вы можете увидеть, что порядо строк правильный сейчас, но Майкрософт неожиданно выпустит патч, где оптимизирует OPENXML -- запихнёт туда параллельную обработку, например, и всё поедет.
10 окт 14, 17:09    [16688483]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
daw
Node Order Comparison Operators

--------------------------------------------------------------------------------

Node order comparison operators compare pairs of nodes, based on their positions in a document.

These are the comparisons that are made, based on document order:

<< : Does operand 1 precede operand 2 in the document order.




что-то не так?

вот это:
based on their positions in a document.

строчка, содержащая XML - это не документ, это просто разметка, документом она становится тогда, когда парсер разберет эту строчку на ноды. В каком порядке он будет делать разбор, и в какм порядке будет помещать ноды в результирующее дерево - нет никакой гарантии. Потом, конечно, можно оприаться на порядок нод в документе, но гарантий соответствия этого порядка порядку в разметке - нет.
10 окт 14, 17:11    [16688494]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Glory
Member

Откуда:
Сообщений: 104751
daw
покажите мне, где в документации сказано, что id в edge table идут в порядке расположения нод в документе, и я тогда перестану видеть, что "не так".

В документации этого нет.
Но выдаваемый результат нумерации показывает, что порядок есть.
id/parentid в результатах не я же сформировал.
10 окт 14, 17:11    [16688495]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
a_voronin
На уровне DOM или .NET порядок гарантирован. XMLDocument в .NET порядок нодов гарантирован

Вы не подскажете ссылку на документацию, где говорится о гарантии соотвествия порядка нод порядку аналогов в разметке для XMLDocument? Я просто в свое время интересовался этим вопросом, но так ничего и не нашел в подтверждение.
10 окт 14, 17:13    [16688504]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Сон Веры Павловны
daw
пропущено...


что-то не так?

вот это:
based on their positions in a document.

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


но тогда в операторе сравнения следования нод не было бы никакого смысла. а его зачем-то ввели. я думаю, создатели xquery, все же, что-то имели в виду.
10 окт 14, 17:25    [16688571]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
Сон Веры Павловны
a_voronin
На уровне DOM или .NET порядок гарантирован. XMLDocument в .NET порядок нодов гарантирован

Вы не подскажете ссылку на документацию, где говорится о гарантии соотвествия порядка нод порядку аналогов в разметке для XMLDocument? Я просто в свое время интересовался этим вопросом, но так ничего и не нашел в подтверждение.


Это очевидно следует из наличия таких функций как InsertAfter, InsertBefore, FirstChild, NextSibling и некоторых других.
http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.insertbefore(v=vs.110).aspx
10 окт 14, 17:42    [16688659]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
daw
но тогда в операторе сравнения следования нод не было бы никакого смысла. а его зачем-то ввели. я думаю, создатели xquery, все же, что-то имели в виду.

Я думаю, они всё же исходили из того, что какие-то гарантии соответствия следования нод есть:
However, you can query an XML document and retrieve the first <Customer> element. Then, you will always retrieve the same customer.

( http://msdn.microsoft.com/ru-ru/library/ms186398.aspx )
и если в цитате под the first <Customer> element подразумевается первый элемент в разметке, то учитывая
The result of the nodes() method is a rowset that contains logical copies of the original XML instances. In these logical copies, the context node of every row instance is set to one of the nodes identified with the query expression, so that subsequent queries can navigate relative to these context nodes.

( http://msdn.microsoft.com/ru-ru/library/ms188282.aspx )
думаю, вполне можно полагать, что результирующий вывод nodes() без order by соответствует расположению нод в разметке, и не ухищряться с xquery-сортировкой. Хотелось бы, чтобы кто-нибудь сказал, что видел примеры несоответствия.
10 окт 14, 17:42    [16688660]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
a_voronin
Это очевидно следует из наличия таких функций как InsertAfter, InsertBefore, FirstChild, NextSibling и некоторых других.
http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.insertbefore(v=vs.110).aspx

Вот именно из них - совсем неочевидно. Еще раз см. выше про разницу между нодой в распарсенном документе, и строчкой символов в разметке.
10 окт 14, 17:44    [16688667]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
Сон Веры Павловны
думаю, вполне можно полагать, что результирующий вывод nodes() без order by соответствует расположению нод в разметке, и не ухищряться с xquery-сортировкой. Хотелось бы, чтобы кто-нибудь сказал, что видел примеры несоответствия.


Ещё раз, пока используются функции DOM порядок гарантируется. Всё, что вы делаете внутри nodes, xpath, xquery имеет гарантированный порядок следования нодов. SelectNodes в XmlDocument тоже. Как только вы пропускаете результат этого через SELECT без ORDER BY результат не гарантирован. Вы можете провести гигантские испытания и доказать что все такие SELECT отработали правильно, а потом при переходе с SQL 2014 на SQL 2016 или накате патча нарваться на изменения порядка.
10 окт 14, 17:46    [16688673]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать порядок строк при селекте из XML?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
a_voronin
Ещё раз, пока используются функции DOM порядок гарантируется. Всё, что вы делаете внутри nodes, xpath, xquery имеет гарантированный порядок следования нодов. SelectNodes в XmlDocument тоже.

Ну, тогда еще раз: ссылку, подтверждающую именно вышесказанное, а не дающая пищу для косвенных выводов.
10 окт 14, 17:48    [16688678]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить