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

Откуда:
Сообщений: 127
Всем привет!

Ребята, подскажите плиз кто знает. Есть задача выводить данные из БД в XML. Как выводить нод даже если его значение NULL? Например:

SELECT 
	1 AS one, 
	2 as two, 
	NULL as three
FOR XML path('')


Возвращает

<one>1</one>
<two>2</two>


Третий элемент отсутствует. Пробовал другим способом:

SELECT 
	1 AS one, 
	2 as two, 
	coalesce(NULL, '') as three
FOR XML path('')


В принципе работает. Возвращает

<one>1</one>
<two>2</two>
<three></three>


Однако хотелось бы иметь результат в виде:

<one>1</one>
<two>2</two>
<three />


Этого реально добиться каким-то красивым способом?

И ещё по этой теме вопрос. Допустим имеются вложенные уровни подзапросов:

SELECT
1 AS one,
2 as two,
(SELECT 4 AS four, 5 as fife FOR XML PATH('subquery'), TYPE)
FOR XML path('')

Возвращает красивый результат:

<one>1</one>
<two>2</two>
<subquery>
<four>4</four>
<fife>5</fife>
</subquery>

Но если подзапрос ничего не вернёт, узел subquery не выводится. А хотелось бы получить такой результат:

<one>1</one>
<two>2</two>
<subquery />

Есть ли элегантное решение для этой задачи?
29 янв 16, 14:15    [18745544]     Ответить | Цитировать Сообщить модератору
 Re: Вывод пустых нодов XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
select 
 1 as one, 
 2 as two, 
 (select null for xml path('three'), type)
for xml path('');
29 янв 16, 14:35    [18745671]     Ответить | Цитировать Сообщить модератору
 Re: Вывод пустых нодов XML  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
BJValentine
В принципе работает. Возвращает

<one>1</one>
<two>2</two>
<three></three>


Однако хотелось бы иметь результат в виде:

<one>1</one>
<two>2</two>
<three />

Это абсолютно одно и то же. Т.е. такие разметки представляеют собой эквивалентные DOM-структуры.
29 янв 16, 15:03    [18745893]     Ответить | Цитировать Сообщить модератору
 Re: Вывод пустых нодов XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Сон Веры Павловны,

Может ТС'у это надо чисто из эстетических соображений? :)
29 янв 16, 15:14    [18745970]     Ответить | Цитировать Сообщить модератору
 Re: Вывод пустых нодов XML  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
invm
Может ТС'у это надо чисто из эстетических соображений? :)

Если так, то ТС читает XML глазами лично. По моему скромному, это в одном ряду с побайтным чтением своими глазами TCP-пакетов.
Хотя, мне доводилось сталкиваться с самопальными парсерами, которые между <node /> и <node></node> видели различия.
29 янв 16, 15:29    [18746113]     Ответить | Цитировать Сообщить модератору
 Re: Вывод пустых нодов XML  [new]
BJValentine
Member

Откуда:
Сообщений: 127
invm
Сон Веры Павловны,

Может ТС'у это надо чисто из эстетических соображений? :)


Совершенно верно :) В принципе, на эту траблу можно и закрыть глаза будет. А вот как вернуть нод если он собой подзапрос возвращает, пока ума не приложу.

invm, не, тут другая ситуация:

SELECT 
	1 AS one, 
	2 as two, 
	(SELECT 4 AS four, 5 as fife WHERE 1=0 FOR XML PATH('subwuery'), TYPE)
FOR XML path('')
29 янв 16, 15:32    [18746145]     Ответить | Цитировать Сообщить модератору
 Re: Вывод пустых нодов XML  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 647
SELECT 
	1 AS one, 
	2 as two, 
	NULL as three
FOR XML path(''), ELEMENTS XSINIL

?
29 янв 16, 15:40    [18746204]     Ответить | Цитировать Сообщить модератору
 Re: Вывод пустых нодов XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
BJValentine
invm, не, тут другая ситуация
Та же самая тут ситуация:
SELECT 
 1 AS one, 
 2 as two, 
 (select (SELECT 4 AS four, 5 as fife WHERE 1=0 FOR XML PATH(''), type) for xml path('subquery'), type)
FOR XML path('')
29 янв 16, 15:47    [18746269]     Ответить | Цитировать Сообщить модератору
 Re: Вывод пустых нодов XML  [new]
BJValentine
Member

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

Сорри, сначала не узрел. Действительно достаточно просто, элегантно и работает. Спасибо огромное! Проблема решена!
29 янв 16, 16:01    [18746374]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить