Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
virtuOS Member Откуда: большая деревня Сообщений: 266 |
Вопрос, как получить xml такого вида:<root> <col1>1</col1> <cols> <col2>1</col2> <col2>2</col2> </cols> </root> Если нет данных для узла <cols>, то xml должен быть такой: Надо получить xml такого вида: <root> <col1>1</col1> <cols> <col2></col2> </cols> </root> Моя попытка: declare @test table (id int) insert into @test (id) values(1), (2) select '1' as 'col1' ,isnull((select id as col2 from @test where 1=1 for xml path(''),type,root('cols')), (select '' as 'cols/col2' for xml path(''))) for xml path('root') При изменении условия в подзапросе на where 1=2 (имитируем отсутствие данных) структура получается иная: <root> <col1>1</col1> <cols> <col2 /> </cols> </root> |
1 июн 16, 16:39 [19246666] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
В рамках XML <col2></col2> и <col2 /> понятие тождественные. Зачем Вам такое поведение нужно? |
1 июн 16, 16:42 [19246681] Ответить | Цитировать Сообщить модератору |
правильный проходящий.
Guest |
virtuOS, в общем-то, с точки зрения стандарта XML, и получаемый, и желаемый "формат" абсолютно одинаковы и одинаково понимаются любыми нормальными XML-парсерами. И потому вопрос надуманный и не стОящий того, чтобы на него тратить время. |
1 июн 16, 16:44 [19246693] Ответить | Цитировать Сообщить модератору |
virtuOS Member Откуда: большая деревня Сообщений: 266 |
Заказчик такое техзадание прислал. Я не уверен, что вариант с <col2 /> его устроит. И возник ещё один вопрос: почему sql не всегда экранирует специальные символы (такие как ", перенос строки). Например, генерируется такой xml: <root> <col1>1 5</col1> <cols> <col2>1</col2> <col2>2</col2> </cols> </root> В то же время другие средства работы с xml (например, DOMDocument в php) создает так: <root> <col1>1 5</col1> <cols> <col2>1</col2> <col2>2</col2> </cols> </root> Кто в данном случае прав? |
1 июн 16, 16:53 [19246729] Ответить | Цитировать Сообщить модератору |
virtuOS Member Откуда: большая деревня Сообщений: 266 |
Вот так правильно:<root> <col1>1 5</col1> <cols> <col2>1</col2> <col2>2</col2> </cols> </root> |
1 июн 16, 16:55 [19246735] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
всё там нормально:declare @test table (id int) insert into @test (id) values(1), (2) select '1' as 'col1' ,isnull((select id as col2 from @test where 1=2 for xml path(''),type,root('cols')), (select '1'+CHAR(13)+'5' as 'cols/col2' for xml path(''))) for xml path('root') <root><col1>1</col1><cols><col2>1
5</col2></cols></root> |
1 июн 16, 16:58 [19246746] Ответить | Цитировать Сообщить модератору |
правильный проходящий.
Guest |
|
||
1 июн 16, 17:01 [19246767] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
Подобного рода вопрос частенько задают на SO. В спецификации все прописано что и как считать идентичными нодами. Если заказчику нужно именно как Вы показали то можете хоть строки клеять... но в итоге получите это: DECLARE @x XML = '<root></root>' SELECT @x |
||
1 июн 16, 17:01 [19246771] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |