Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 FOR XML. Обернуть значения в CDATA  [new]
хм...
Guest
Подскажите, как в запросе FOR XML обернуть значения в <![CDATA[]]>?
т.е.
with xxx as (
	select 1 id, 'asd' name, '\t' delimiter union all
	select 2 id, '34e' name, '\t' delimiter union all
	select 3 id, '5rf' name, '\r\n' delimiter
)
select
	  id as 'field/@id'
	, name as 'field/@name'
	, delimiter as 'field' 
from xxx
for xml path(''),elements, type, root('root')
на выходе необходимо получить следующий XML:
<root>
<field id="1" name="asd"><![CDATA[\t]]></field>
<field id="2" name="34e"><![CDATA[\t]]></field>
<field id="3" name="5rf"><![CDATA[\r\n]]></field>
</root>
13 апр 09, 13:10    [7056728]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML. Обернуть значения в CDATA  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
хм...
Подскажите, как в запросе FOR XML обернуть значения в <![CDATA[]]>?
Пример из BOL:
SELECT  1 as Tag,
        0 as Parent,
        ProductModelID  as [ProductModel!1!ProdModelID],
        Name            as [ProductModel!1!Name],
        '<Summary>This is summary description</Summary>'   
            as [ProductModel!1!!CDATA] -- no attribute name so ELEMENT assumed
FROM    Production.ProductModel
WHERE   ProductModelID=19
FOR XML EXPLICIT

Результирующий набор:

<ProductModel ProdModelID="19" Name="Mountain-100">
   <![CDATA[<Summary>This is summary description</Summary>]]>
</ProductModel>
13 апр 09, 13:13    [7056744]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML. Обернуть значения в CDATA  [new]
хм...
Guest
Спасибо, alexeyvg
Не используя EXPLICIT желаемый результат получить не удастся?
13 апр 09, 13:16    [7056769]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML. Обернуть значения в CDATA  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
хм...
Спасибо, alexeyvg
Не используя EXPLICIT желаемый результат получить не удастся?
Да, по моему, EXPLICIT нужен
13 апр 09, 15:30    [7056996]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: FOR XML. Обернуть значения в CDATA  [new]
AlexPiter
Member

Откуда:
Сообщений: 42
Подниму темку.
Да, пример из BOL работает.
Следующий кусок кода тоже работает:
SELECT  1 AS Tag,
        0 AS Parent,
        1  AS [ProductModel!1!ProdModelID],
        2            AS [ProductModel!1!Name],
        '<Summary>This is summary description</Summary>'   
            AS [ProductModel!1!!CDATA] -- no attribute name so ELEMENT assumed

FOR XML EXPLICIT;
Мы получим

<ProductModel ProdModelID="1" Name="2"><![CDATA[<Summary>This is summary description</Summary>]]></ProductModel>

Но следующее не работает:
declare @tTempTable table(
        Tag int, Parent int,
        
        [ProductModel!1!ProdModelID] int,
        [ProductModel!1!Name] varchar(13),
        [ProductModel!1!!CDATA] text)



insert into @tTempTable(Tag, Parent, [ProductModel!1!ProdModelID], [ProductModel!1!Name], [ProductModel!1!!CDATA])
values (1, 0, 1, 2, '<Summary>This is summary description</Summary>')

declare @xDoc XML

select @xDoc=(select * from @tTempTable for XML EXPLICIT)

select @xDoc     
Получаем

<ProductModel ProdModelID="1" Name="2"><Summary>This is summary description</Summary></ProductModel>
То есть без CDATA.
А мне надо чтобы XML EXPLICIT обрабатывал именно таблицу.
Различий в упор не вижу. Подскажите, пожалуйста, как получить CDATA?
8 июн 11, 17:04    [10784685]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML. Обернуть значения в CDATA  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
AlexPiter,

скорее всего никак тынц

тип данных xml походу не поддерживает этот формат
8 июн 11, 17:27    [10784908]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML. Обернуть значения в CDATA  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Подскажите, пожалуйста, как получить CDATA?

в переменной типа xml - никак не получить. бай дизайн. "This follows both the W3C standard and the SQL Standard part 14 on providing XML support in the database.".
http://connect.microsoft.com/SQLServer/feedback/details/298860/xml-cdata-tag-is-lost-when-converting-to-xml-data-type
8 июн 11, 17:41    [10785061]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML. Обернуть значения в CDATA  [new]
AlexPiter
Member

Откуда:
Сообщений: 42
Черт, как вы правы.
Есть ли какие-нибудь предположения?
Тот, с кем мы обмениваемся xml-ами, возможно (очень надеюсь, что нет), упрется в CDATA.
Они уже уперлись в обязательное отсутствие тегов вида:
<SupplierItemCode/> - что обозначает пустое значение.
У них парсер от такого глючит...
8 июн 11, 18:00    [10785236]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML. Обернуть значения в CDATA  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
AlexPiter
Черт, как вы правы.
Есть ли какие-нибудь предположения?
Тот, с кем мы обмениваемся xml-ами, возможно (очень надеюсь, что нет), упрется в CDATA.
Они уже уперлись в обязательное отсутствие тегов вида:
<SupplierItemCode/> - что обозначает пустое значение.
У них парсер от такого глючит...


а что тут предполагать? не включили мелкософты cdata в тип xml вот и всё, так что вам остается тока делать чистый explicit и его результаты ловить клиентом и обрабатывать самостоятельно.
8 июн 11, 18:45    [10785486]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML. Обернуть значения в CDATA  [new]
AlexPiter
Member

Откуда:
Сообщений: 42
Ха, а я получил CDATA только что.
На примере из BOL:
declare @sXML nvarchar(max)
set @sXML=cast((
SELECT 1 AS Tag,
0 AS Parent,
1 AS [ProductModel!1!ProdModelID],
2 AS [ProductModel!1!Name],
'<Summary>This is summary description</Summary>'
AS [ProductModel!1!!CDATA] -- no attribute name so ELEMENT assumed
FOR XML EXPLICIT
) as nvarchar(max))

select @sXML

Мы имеем строковую переменную с текстом xml, в которой есть CDATA.
В принципе это мне и надо было, т.к. всё равно я посылаю xml в виде текста.
9 июн 11, 09:58    [10787354]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить