Я не совсем уверен, что вы действительно хотите. Я предполагаю, что ваш корневой узел должен быть <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><P>Smith Tim</P></name>
</customer>
<customer>
<name><P>Fonda Jane</P></name>
</customer>
</customers>