Если я это сделаю
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, '&', '&') + '</Email></Emails>' AS XML)
Вывод
<Emails><Email>xxx&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> <Email>xxx&xx@monop.com</Email> </Emails
Чего я пытаюсь добиться, так это сохранить данные как есть, т.е. желаемый вывод должен быть
<Emails><Email>xxx&xx@monop.com</Email></Emails>
Возможно ли это вообще?
Я знаю, что функция замены завершится ошибкой, если какой-либо другой специальный символ, который xml не сможет понять, будет передан ей в качестве входных данных, например. '<' в каком случае нам снова нужно его заменить...
Спасибо