Tsql XML явный путь - PullRequest
       46

Tsql XML явный путь

0 голосов
/ 07 мая 2018

У меня есть запрос:

select 1 as Tag , 0 as Parent , '<P>' + 'Name' + ' ' + 'SurName' + '</P>' as "name!1!!CDATA" from tPA_SysParamSys for xml explicit, root('customers')

какой вывод:

<customers> <name><![CDATA[<P>Name SurName</P>]]></name> </customers>

Но вместо этого я хочу:

<customer> <customers> <name><![CDATA[<P>Name SurName</P>]]></name> </customers> </customer>

Без EXPLICIT и CDATA, но с помощью PATH я могу это сделать, но не могу сделать с CDATA.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я не совсем уверен, что вы действительно хотите. Я предполагаю, что ваш корневой узел должен быть <customers> (множественное число), в то время как каждая строка равна одному <customer>. Я предполагаю, что Name и SurName - это столбцы, живущие в вашей таблице.

Может быть, это то, что вы ищете:

DECLARE @mockupTable TABLE([Name] VARCHAR(100),SurName VARCHAR(100));
INSERT INTO @mockupTable VALUES('Smith','Tim'),('Fonda','Jane');

select 1 as Tag , 
0 as Parent ,
'<P>' + Name + ' ' + SurName + '</P>' as "customer!1!name!CDATA" 
from @mockupTable 
for xml explicit, root('customers');

Результат

<customers>
  <customer>
    <name><![CDATA[<P>Smith Tim</P>]]></name>
  </customer>
  <customer>
    <name><![CDATA[<P>Fonda Jane</P>]]></name>
  </customer>
</customers>

Но, пожалуйста, позвольте мне задать вопрос: почему?

Абсолютно нет необходимости в CDATA разделах. Правильно экранированный нормальный text() узел семантически идентичен. Разработчики SQL-сервера решили даже больше не поддерживать это ...

Если вы храните XML, включающий CDATA разделы, они переводятся неявно. Попробуйте:

DECLARE @xml XML=
N'<customers>
  <customer>
    <name><![CDATA[<P>Smith Tim</P>]]></name>
  </customer>
  <customer>
    <name><![CDATA[<P>Fonda Jane</P>]]></name>
  </customer>
</customers>';
SELECT @xml;

Вы получаете это:

<customers>
  <customer>
    <name>&lt;P&gt;Smith Tim&lt;/P&gt;</name>
  </customer>
  <customer>
    <name>&lt;P&gt;Fonda Jane&lt;/P&gt;</name>
  </customer>
</customers>
0 голосов
/ 07 мая 2018

С этим запросом ...

with c 
as 
( 
select 1 as CustomerId, 'Name1' as Name1, 'Name2' as Name2 
union select 2, 'Name1', 'Name2' 
) 
select 1 as Tag 
    , 0 as Parent 
    , CustomerId as "customer!1!customer_id!hide" 
    , null as "name!2!!CDATA" 
from c 
union 
select 2 as Tag 
    , 1 as Parent 
    , CustomerId 
    , Name1 + ' ' + Name2 as "name!2!!CDATA" 
from tCustomers c 
order by "customer!1!customer_id!hide", Tag 
for xml explicit, root('customers') 

Вы получите этот XML ...

<customers>
  <customer>
    <name><![CDATA[Comp1Name1 Comp1Name2]]></name>
  </customer>
  <customer>
    <name><![CDATA[Comp2Name1 Comp2Name2]]></name>
  </customer>
</customers>

Вдохновленный этой ссылкой ... https://www.experts -exchange.com / questions / 26194239 / CDATA-теги-неправильно-в-выводе-XML-вывода-используя-FOR-XML-PATH.html

...