Le stockage de caractère spécial(par exemple, &) dans le type de données XML

Si je ne

Declare @t table(Email xml)
Declare @email varchar(100) = 'xxx&[email protected]'
Insert into @t  
select '<Emails> <Email>' + @email +'</Email></Emails>'
select * From @t

Je vais vous prévu d'erreur

Msg 9411, Niveau 16, État 1, Ligne 8
Analyse XML: ligne 1, le caractère 27, point-virgule attendue

Une solution que j'ai trouvé presque partout(y compris DONC) est à replace '&' with '&amp; et il fonctionne

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

Sortie

<Emails><Email>xxx&amp;[email protected]</Email></Emails>

Cependant, j'ai essayé avec CData approche (juste une autre façon d'aborder le problème)

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

Quand j'ai eu le dessous de sortie

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

Ce que je suis en train de réaliser est de stocker les données comme il est c'est à dire la sortie désirée doit être

<Emails><Email>xxx&[email protected]</Email></Emails>

Est-il possible?

Je sais que la fonction remplacer échouera si un autre caractère spécial que xml ne parvient pas à comprendre sera passée comme une entrée à elle par exemple '<' i, auquel cas nous avons encore besoin de le remplacer...

Grâce

OriginalL'auteur | 2012-06-10