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

Откуда:
Сообщений: 244
Коллеги, почему при использовании for xml пустой результат это DBNull, а не пустой xml с одним тэгом root ?

Пример демонстрирующий проблему:
select top(0) null as [test]

select top(0) null as [test]
for xml path('Order')
,type
,elements xsinil
,root ('Orders')

select
(
select top(0) null as [test]
for xml path('Order')
,type
,elements xsinil
)
for xml path('Orders')
,type
,elements xsinil

Первый запрос не XML, при пустом результате есть набор данных с кол-вом 0 записей.
Во втором случае null вместо xml, а хотелось бы чтобы во втором случае результат был, как в третьем, но без использования вложенного запроса. Можно что-то сделать?

sql server 2008 r2
24 окт 12, 17:21    [13370190]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
41 просмотр...

Никто не может объяснить почему:
пустой набор - это пустой набор, а
в xml пустой набор - это null, а не пустой xml-документ?
И самое главное, как это исправить без родительского запроса и переменной типа xml с последующей проверкой на null?
25 окт 12, 10:09    [13372477]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
в xml пустой набор - это null, а не пустой xml-документ?

А кто-то может объяснить, что такое "пустой xml-документ" ?
25 окт 12, 11:01    [13372832]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory,
да, реузльтат третьего запроса дает именно пустой xml-документ c одним тэгом root.
25 окт 12, 13:27    [13373987]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, вот результат

<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
25 окт 12, 13:27    [13373997]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Glory, вот результат

<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

И что неправильно то ?
25 окт 12, 13:30    [13374013]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, например, ",elements xsinil" означает, что я хочу получить название полей, даже если их значение null. Все отлично работает, когда кол-во записей 1 и более, но если 0, то я не получаю название полей и вообще ничего не получаю, поведение различается с обычной выборкой. Или я не прав?
25 окт 12, 13:30    [13374018]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, Все правильно.
Но хотелось, чтобы второй запрос возвращал такой же результат, а не Null
25 окт 12, 13:31    [13374026]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Но хотелось, чтобы второй запрос возвращал такой же результат, а не Null

Почему разные запросы должны возвращать одинаковый результат ?
25 окт 12, 13:33    [13374039]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Ещё раз, но с результатами:

1)
select top(0) null as [test]

Результат:
Column: test
Value: null


2)
select top(0) null as [test]
for xml path('Order')
,type
,elements xsinil
,root ('Orders')

Результат: null

3)
select
(
select top(0) null as [test]
for xml path('Order')
,type
,elements xsinil
)
for xml path('Orders')
,type
,elements xsinil

Результат:
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />


Вопрос, почему во втором случае не тот результат, который в третьем?
25 окт 12, 13:34    [13374050]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Вопрос, почему во втором случае не тот результат, который в третьем?

Потому что разные запросы
select top(0)
(
select top(0) null as [test]
for xml path('Order')
,type
,elements xsinil
)
for xml path('Orders')
,type
,elements xsinil
25 окт 12, 13:36    [13374058]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory
super-code
Но хотелось, чтобы второй запрос возвращал такой же результат, а не Null

Почему разные запросы должны возвращать одинаковый результат ?

Конечно разные запросы не обязаны вовращать разные результаты. Я бы хотел, чтобы если я деалю запрос и получаю набор данных, пусть и пустой, то если я указываю к нему xml, то я тоже получаю набор данных, пусть и пустой. Но я никак не ожидаю null в ответ от сервера. Почему сервер это делает, что за стандарт такой считать null - пустым xml-документом?
Вообщем ладно, обернул все в родительский запрос, тему можно закрыть... Понимания от коллег не нашел, видимо, я сам где-то неправ.
25 окт 12, 13:38    [13374078]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Конечно разные запросы не обязаны вовращать разные результаты.

Что ?
super-code
1)
select top(0) null as [test]


Результат:
Column: test
Value: null

Этот запрос не возврашает никаго NULL. Это пустой набор, а не NULL

super-code
Я бы хотел, чтобы если я деалю запрос и получаю набор данных,

В том то и дело, что ваши запросы производят разные результаты
Вы просто не понимаете, когда какую часть запроса выполняет сервер.
25 окт 12, 13:46    [13374155]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory
super-code
Конечно разные запросы не обязаны вовращать разные результаты.

Что ? Разные запросы не обязаны возвращать разные результаты, разные запросы не обязаны возвращать одинаковые результаты.
super-code
1)
select top(0) null as [test]


Результат:
Column: test
Value: null

Этот запрос не возврашает никаго NULL. Это пустой набор, а не NULL
Ок. Результат такой:
Column: test


super-code
Я бы хотел, чтобы если я деалю запрос и получаю набор данных,

В том то и дело, что ваши запросы производят разные результаты
Вы просто не понимаете, когда какую часть запроса выполняет сервер.

Ещё раз. Почему пустой набор xml-данных и null это одно и тоже. Строка нулевой длинны и null это тоже одно тоже, по Вашему, как в oracle? Видимо проектировщик тот же был.
25 окт 12, 15:12    [13374885]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Ещё раз. Почему пустой набор xml-данных и null это одно и тоже. Строка нулевой длинны и null это тоже одно тоже, по Вашему, как в oracle? Видимо проектировщик тот же был.

Вы бредите
Идите почитайте про то, когда выполняется каждая из частей запроса в MSSQL

select null as [test]

select null as [test]
for xml path('Order')
,type
,elements xsinil
,root ('Orders')

select
(
select null as [test]
for xml path('Order')
,type
,elements xsinil
)
for xml path('Orders')
,type
,elements xsinil
25 окт 12, 15:26    [13374987]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, т.е. Вы мне тонко намекаете, что сначала производится выборка, а потом выборка конвертируется в xml результат - отлично. И если выборки нет, то и конвертировать ничего не надо, поэтому результат null, так? логично.

Единственное, что мне хотелось бы, чтобы ключевое слово root в конструкции for xml оборачивал весь результат в главный тэг. Как и сказано в документации. Но чтобы это не зависило от того, пустой это результат или нет... Такой возможности нет, я уже понял.
25 окт 12, 15:45    [13375173]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Glory, т.е. Вы мне тонко намекаете, что сначала производится выборка, а потом выборка конвертируется в xml результат - отлично. И если выборки нет, то и конвертировать ничего не надо, поэтому результат null, так? логично.

Единственное, что мне хотелось бы, чтобы ключевое слово root в конструкции for xml оборачивал весь результат в главный тэг. Как и сказано в документации. Но чтобы это не зависило от того, пустой это результат или нет... Такой возможности нет, я уже понял.

Вы запустили ?

select *
from (
select null as [test]

) a
for xml path('Orders')
,type
,elements xsinil

Где там NULL ?
Там
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><test xsi:nil="true" /></Orders>
Потому что набор с одной записью со значением NULL не то же самое, что отсутствие набора
select *
from (
select top (0) null as [test]

) a
for xml path('Orders')
,type
,elements xsinil
25 окт 12, 16:02    [13375307]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, набор с одной записью null и набор с нулем записей это разные вещи, согласен.

Меня интересует другое: почему ключевое слово root не оборачивает "набор с нулем записей" в родительский тэг?
Вот MSDN:
"root - Указывает, что к результирующему XML-документу будет добавлен один элемент верхнего уровня.Дополнительно можно указать имя корневого элемента, который необходимо сформировать.Значение по умолчанию — «root»."
Почему к набору с нулем записей не добавляется тэг верхнего уровня? Это мой единственный вопрос, возможно, плохо объясняю.
25 окт 12, 16:12    [13375398]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Меня интересует другое: почему ключевое слово root не оборачивает "набор с нулем записей" в родительский тэг?

Как можно что-то добавить к ничему ? К пустому месту ?
25 окт 12, 16:13    [13375410]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, и ещё отсутствие набора и набор с нулем записей мне кажется разные вещи. Отсутствие набора - это когда ничего не запрашивали, а набор с нулем записей, это когда был запрос, который выполнен и вернул ноль записей, но возможно вернул колонки.
25 окт 12, 16:14    [13375418]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Отсутствие набора - это когда ничего не запрашивали, а набор с нулем записей, это когда был запрос, который выполнен и вернул ноль записей, но возможно вернул колонки.

Мда
select top (0) null as [test] возвращает пустой набор с одной колонкой по имени [test]
25 окт 12, 16:17    [13375447]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Glory, можно обернуть ничего тэгом, пример уже был приведен, вот ещё раз
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
Что в этом тэги? Ничего.
25 окт 12, 16:17    [13375448]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
super-code
Glory, можно обернуть ничего тэгом, пример уже был приведен, вот ещё раз
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
Что в этом тэги? Ничего.

Вы издеваетесь ?
Вы не различаете подзапрос как источник данных и подзапрос как значение поля ?

select
(
select top(0) null as [test]
for xml path('Order')
,type
,elements xsinil
) as columnx
for xml path('Orders')
,type
,elements xsinil
25 окт 12, 16:22    [13375497]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
Glory
Member

Откуда:
Сообщений: 104751
select
(
select top(0) null as [test]
for xml path('Order')
,type
,elements xsinil
) as test
for xml path('Orders')
,type
,elements xsinil

select * from
(
select top(0) null as [test]
for xml path('Order')
,type
,elements xsinil
) as tablex(test)
for xml path('Orders')
,type
,elements xsinil
25 окт 12, 16:25    [13375525]     Ответить | Цитировать Сообщить модератору
 Re: for xml и пустой результат  [new]
super-code
Member

Откуда:
Сообщений: 244
Я понимаю результаты, но мне кажется не логичным, что:
1. при пустом запросе select top(0) null клиенту отправляется набора данных. И пусть в нем 0 строк;
2. когда надо обернуть такой же запрос с тэгом root, то сервер прикидывается, что набора нет.
Вот не логично и все, в одном случае сервер считает, что набор есть, но в нем 0 строк, в другом случае, что набора нет, поэтому и оборачивать ничего не надо.

Glory
Вы издеваетесь ?

Уже и сам не знаю, простите.
25 окт 12, 16:33    [13375590]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить