Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
41 просмотр... Никто не может объяснить почему: пустой набор - это пустой набор, а в xml пустой набор - это null, а не пустой xml-документ? И самое главное, как это исправить без родительского запроса и переменной типа xml с последующей проверкой на null? |
25 окт 12, 10:09 [13372477] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
А кто-то может объяснить, что такое "пустой xml-документ" ? |
||
25 окт 12, 11:01 [13372832] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Glory, да, реузльтат третьего запроса дает именно пустой xml-документ c одним тэгом root. |
25 окт 12, 13:27 [13373987] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Glory, вот результат<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> |
25 окт 12, 13:27 [13373997] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
И что неправильно то ? |
||
25 окт 12, 13:30 [13374013] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Glory, например, ",elements xsinil" означает, что я хочу получить название полей, даже если их значение null. Все отлично работает, когда кол-во записей 1 и более, но если 0, то я не получаю название полей и вообще ничего не получаю, поведение различается с обычной выборкой. Или я не прав? |
25 окт 12, 13:30 [13374018] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Glory, Все правильно. Но хотелось, чтобы второй запрос возвращал такой же результат, а не Null |
25 окт 12, 13:31 [13374026] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Почему разные запросы должны возвращать одинаковый результат ? |
||
25 окт 12, 13:33 [13374039] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Потому что разные запросы 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] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Конечно разные запросы не обязаны вовращать разные результаты. Я бы хотел, чтобы если я деалю запрос и получаю набор данных, пусть и пустой, то если я указываю к нему xml, то я тоже получаю набор данных, пусть и пустой. Но я никак не ожидаю null в ответ от сервера. Почему сервер это делает, что за стандарт такой считать null - пустым xml-документом? Вообщем ладно, обернул все в родительский запрос, тему можно закрыть... Понимания от коллег не нашел, видимо, я сам где-то неправ. |
||||
25 окт 12, 13:38 [13374078] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Что ?
Этот запрос не возврашает никаго NULL. Это пустой набор, а не NULL
В том то и дело, что ваши запросы производят разные результаты Вы просто не понимаете, когда какую часть запроса выполняет сервер. |
||||||
25 окт 12, 13:46 [13374155] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Ещё раз. Почему пустой набор xml-данных и null это одно и тоже. Строка нулевой длинны и null это тоже одно тоже, по Вашему, как в oracle? Видимо проектировщик тот же был. |
||||||||
25 окт 12, 15:12 [13374885] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вы бредите Идите почитайте про то, когда выполняется каждая из частей запроса в 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] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Glory, т.е. Вы мне тонко намекаете, что сначала производится выборка, а потом выборка конвертируется в xml результат - отлично. И если выборки нет, то и конвертировать ничего не надо, поэтому результат null, так? логично. Единственное, что мне хотелось бы, чтобы ключевое слово root в конструкции for xml оборачивал весь результат в главный тэг. Как и сказано в документации. Но чтобы это не зависило от того, пустой это результат или нет... Такой возможности нет, я уже понял. |
25 окт 12, 15:45 [13375173] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вы запустили ? 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] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Glory, набор с одной записью null и набор с нулем записей это разные вещи, согласен. Меня интересует другое: почему ключевое слово root не оборачивает "набор с нулем записей" в родительский тэг? Вот MSDN: "root - Указывает, что к результирующему XML-документу будет добавлен один элемент верхнего уровня.Дополнительно можно указать имя корневого элемента, который необходимо сформировать.Значение по умолчанию — «root»." Почему к набору с нулем записей не добавляется тэг верхнего уровня? Это мой единственный вопрос, возможно, плохо объясняю. |
25 окт 12, 16:12 [13375398] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Как можно что-то добавить к ничему ? К пустому месту ? |
||
25 окт 12, 16:13 [13375410] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Glory, и ещё отсутствие набора и набор с нулем записей мне кажется разные вещи. Отсутствие набора - это когда ничего не запрашивали, а набор с нулем записей, это когда был запрос, который выполнен и вернул ноль записей, но возможно вернул колонки. |
25 окт 12, 16:14 [13375418] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Мда select top (0) null as [test] возвращает пустой набор с одной колонкой по имени [test] |
||
25 окт 12, 16:17 [13375447] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Glory, можно обернуть ничего тэгом, пример уже был приведен, вот ещё раз <Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> Что в этом тэги? Ничего. |
25 окт 12, 16:17 [13375448] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вы издеваетесь ? Вы не различаете подзапрос как источник данных и подзапрос как значение поля ? 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
super-code Member Откуда: Сообщений: 244 |
Я понимаю результаты, но мне кажется не логичным, что: 1. при пустом запросе select top(0) null клиенту отправляется набора данных. И пусть в нем 0 строк; 2. когда надо обернуть такой же запрос с тэгом root, то сервер прикидывается, что набора нет. Вот не логично и все, в одном случае сервер считает, что набор есть, но в нем 0 строк, в другом случае, что набора нет, поэтому и оборачивать ничего не надо.
Уже и сам не знаю, простите. |
||
25 окт 12, 16:33 [13375590] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |