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

Откуда: Kazan
Сообщений: 47
Всем, привет.
Помогите пожалуйста, нужно результат выполнения запроса с UNION и FOR XML EXPLICIT записать в переменную


DECLARE @xml xml

SET @xml = 
(SELECT 1 AS Tag,
0 AS Parent,
'' AS [add_info_format!1],
null AS [add_info!2],
null AS [add_info!2!body!CDATA]
UNION ALL
SELECT 2 as Tag,
1 as Parent,
null AS [add_info_format!1],
'' AS [add_info!2],
'Здесь инфа которую нужно положить в блок CDATA' AS [add_info!2!body!CDATA]
FOR XML EXPLICIT, BINARY BASE64)


Выдает ошибку "The FOR XML clause is invalid in views, inline functions, derived tables, and subqueries when they contain a set operator. To work around, wrap the SELECT containing a set operator using derived table syntax and apply FOR XML on top of it."

Версия: SQL SERVER 2008 R2

Если без UNION например

SET @xml = 
(SELECT 1 AS Tag,
0 AS Parent,
'' AS [add_info_format!1],
null AS [add_info!2],
null AS [add_info!2!body!CDATA]
FOR XML EXPLICIT, BINARY BASE64)


Или

SET @xml = 
(SELECT 
'' as 'add_info', 
'Здесь инфа которую нужно положить в блок CDATA' as 'add_info/body'
FOR XML PATH (''), TYPE, ELEMENTS, ROOT ('add_info_format'))


Срабатывает.
1 май 17, 16:59    [20448179]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
SET @xml = 
(select * from (SELECT 1 AS Tag,
0 AS Parent,
'' AS [add_info_format!1],
null AS [add_info!2],
null AS [add_info!2!body!CDATA]
UNION ALL
SELECT 2 as Tag,
1 as Parent,
null AS [add_info_format!1],
'' AS [add_info!2],
'Здесь инфа которую нужно положить в блок CDATA' AS [add_info!2!body!CDATA]) t
FOR XML EXPLICIT, BINARY BASE64);
1 май 17, 17:19    [20448198]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
gnatochka
Member

Откуда: Kazan
Сообщений: 47
Спасибо!!!
1 май 17, 19:10    [20448283]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
gnatochka
Member

Откуда: Kazan
Сообщений: 47
Не сразу заметила, не выходит каменный цветок :(

Declare @xml xml
SET @xml = 
(select * from (SELECT 1 AS Tag,
0 AS Parent,
'' AS [add_info_format!1],
null AS [add_info!2],
null AS [add_info!2!body!CDATA]
UNION ALL
SELECT 2 as Tag,
1 as Parent,
null AS [add_info_format!1],
'' AS [add_info!2],
'Здесь инфа которую нужно положить в блок CDATA <!Это НЕ XML!!!> ===' AS [add_info!2!body!CDATA]) t
FOR XML EXPLICIT, BINARY BASE64);


При таком преобразовании блок CDATA не создается! И соответственно все спецсимволы заменяются при формировании XML :(

Если просто запрос запустить - результат:
<add_info_format>
  <add_info>
    <body><![CDATA[Здесь инфа которую нужно положить в блок CDATA <!Это НЕ XML!!!> ===]]></body>
  </add_info>
</add_info_format>

А если в переменную присваиваешь, через (select * from (...

<add_info_format>
  <add_info>
    <body>Здесь инфа которую нужно положить в блок CDATA &lt;!Это НЕ XML!!!&gt; ===</body>
  </add_info>
</add_info_format>
2 май 17, 10:18    [20448930]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
aleks2
Guest
Медитируй
select * from (SELECT 1 AS Tag,
0 AS Parent,
'' AS [add_info_format!1],
null AS [add_info!2],
null AS [add_info!2!body!CDATA]
UNION ALL
SELECT 2 as Tag,
1 as Parent,
null AS [add_info_format!1],
'' AS [add_info!2],
'Здесь инфа которую нужно положить в блок CDATA <!Это НЕ XML!!!> ===' AS [add_info!2!body!CDATA]) t
FOR XML EXPLICIT, BINARY BASE64, type;
select * from (SELECT 1 AS Tag,
0 AS Parent,
'' AS [add_info_format!1],
null AS [add_info!2],
null AS [add_info!2!body!CDATA]
UNION ALL
SELECT 2 as Tag,
1 as Parent,
null AS [add_info_format!1],
'' AS [add_info!2],
'Здесь инфа которую нужно положить в блок CDATA <!Это НЕ XML!!!> ===' AS [add_info!2!body!CDATA]) t
FOR XML EXPLICIT, BINARY BASE64;
2 май 17, 10:26    [20448975]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
gnatochka
Member

Откуда: Kazan
Сообщений: 47
Еще раз спасибо, медитация помогла :)

Сам нижний запрос (без type, как у меня и был) Выводит с <![CDATA[]]> , но если присваивать результат его выполнения в переменную типа xml в переменной результат уже без <![CDATA[]]>

А вот если присвоить в переменную типа varchar(max) то все замечательно!
2 май 17, 11:00    [20449127]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
gnatochka
При таком преобразовании блок CDATA не создается!
Так и было задумано - https://connect.microsoft.com/SQLServer/feedback/details/298860/xml-cdata-tag-is-lost-when-converting-to-xml-data-type

Зачем нужен CDATA? Для визуализации данных в xml?
2 май 17, 11:11    [20449186]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
gnatochka
Member

Откуда: Kazan
Сообщений: 47
Условие сторонней организации, с которой будет обмен информацией.
Текст письма, и передаваемые файлы в формате BINARY BASE64 должны быть заключены в <![CDATA[]]>

Спасибо, Вам огромное!
2 май 17, 11:17    [20449208]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
aleks2
Guest
invm
gnatochka
При таком преобразовании блок CDATA не создается!
Так и было задумано - https://connect.microsoft.com/SQLServer/feedback/details/298860/xml-cdata-tag-is-lost-when-converting-to-xml-data-type

Зачем нужен CDATA? Для визуализации данных в xml?


Шоб туды пихать мусор с тегами невозбранно.

Парсеры XML не обрабатывают содержимое секций CDATA.
2 май 17, 11:53    [20449409]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
aleks2
Шоб туды пихать мусор с тегами невозбранно.
https://ru.wikipedia.org/wiki/CDATA
В XML документах фрагмент, помещённый внутрь CDATA, — это часть содержания элемента, которая помечена для парсера как содержащая только символьные данные, а не разметку. CDATA — это просто альтернативный синтаксис для отображения символьных данных, нет никакой смысловой разницы между символьными данными, которые объявлены как CDATA и символьными данными, которые объявлены в обычном синтаксисе и где «<» и «>» будут представлены как «& lt;» и «& gt;», соответственно.

aleks2
Парсеры XML не обрабатывают содержимое секций CDATA.
Вот и запихай в CDATA что-нибудь неразрешенное в XML и проверь свое утверждение.
2 май 17, 13:16    [20449808]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
aleks2
Guest
invm
aleks2
Шоб туды пихать мусор с тегами невозбранно.
https://ru.wikipedia.org/wiki/CDATA
В XML документах фрагмент, помещённый внутрь CDATA, — это часть содержания элемента, которая помечена для парсера как содержащая только символьные данные, а не разметку. CDATA — это просто альтернативный синтаксис для отображения символьных данных, нет никакой смысловой разницы между символьными данными, которые объявлены как CDATA и символьными данными, которые объявлены в обычном синтаксисе и где «<» и «>» будут представлены как «& lt;» и «& gt;», соответственно.

aleks2
Парсеры XML не обрабатывают содержимое секций CDATA.
Вот и запихай в CDATA что-нибудь неразрешенное в XML и проверь свое утверждение.


Мне этого не требуется.

1. Мне уже напихали. Причем изрядно.
2. Чти стандарт XML.
2 май 17, 13:23    [20449859]     Ответить | Цитировать Сообщить модератору
 Re: Результат выполнения запроса с FOR XML EXPLICIT в переменную  [new]
aleks2
Guest
https://msdn.microsoft.com/ru-ru/library/ms256076(v=vs.120).aspx

Разделы CDATA дают возможность сообщить синтаксическому анализатору, что среди символов, содержащихся в разделе CDATA, разметка отсутствует. Это упрощает создание документов с разделами, в которых могут появиться отдельные символы разметки, но на самом деле разметки нет. В разделы CDATA часто помещают содержимое на языке скриптов, а также образцы содержимого XML и HTML.
2 май 17, 13:25    [20449873]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить