Сохранение специального символа (например, &) в типе данных XML

Если я это сделаю

Declare @t table(Email xml)
Declare @email varchar(100) = 'xxx&xx@monop.com'
Insert into @t  
select '<Emails> <Email>' + @email +'</Email></Emails>'
select * From @t

Я получу ожидаемую ошибку

Msg 9411, уровень 16, состояние 1, строка 8 Анализ XML: строка 1, символ 27, ожидается точка с запятой

Одно решение, которое я нашел почти везде (включая SO), состоит в том, чтобы заменить '&' на '& , и это работает

Insert into @t  
select CAST('<Emails><Email>' + REPLACE(@email, '&', '&amp;') + '</Email></Emails>' AS XML)

Вывод

<Emails><Email>xxx&amp;xx@monop.com</Email></Emails>

Тем не менее, я пытался использовать подход CData (просто еще один способ решения проблемы)

Declare @t table(Email xml)
Declare @email varchar(100) = 'xxx&xx@monop.com'
Insert into @t  
Select CAST('<![CDATA[Emails> <Email>' + @email + '</Email> </Emails]]>' AS XML)
select * From @t

Когда я получил приведенный ниже вывод

Emails&gt; &lt;Email&gt;xxx&amp;xx@monop.com&lt;/Email&gt; &lt;/Emails

Чего я пытаюсь добиться, так это сохранить данные как есть, т.е. желаемый вывод должен быть

<Emails><Email>xxx&xx@monop.com</Email></Emails>

Возможно ли это вообще?

Я знаю, что функция замены завершится ошибкой, если какой-либо другой специальный символ, который xml не сможет понять, будет передан ей в качестве входных данных, например. '<' в каком случае нам снова нужно его заменить...

Спасибо

5
задан OMG Ponies 10 June 2012 в 06:51
поделиться