5

私が行った場合

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

予期したエラーが発生します

メッセージ9411、レベル16、状態1、行8 XML解析:行1、文字27、セミコロンが必要

私がほとんどどこでも(SOを含む)見つけた解決策の1つはreplace '&' with '&amp;

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が理解できない他の特殊文字が入力として渡されると、置換関数が失敗することを私は知っています。たとえば、'<' iこの場合も、置換する必要があります...

ありがとう

4

2 に答える 2

3

タグはCDATAではなくPCDATAであるため、CDATAセクションに入れないでください。

于 2012-06-10T06:52:36.937 に答える
2

XMLを使用する場合は、SQLServerのXML関連の機能を使用する必要があります。

例えば:

/* Create xml and add a variable to it */
DECLARE 
    @xml xml = '<Emails />',
    @email varchar(100) = 'xxx&xx@monop.com';

SET @xml.modify ('insert (
    element Email {sql:variable("@email")}
) into (/Emails)[1]');

SELECT @xml;

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

/* Extract value from xml */

DECLARE @email_out varchar(200);

SET @email_out = @xml.value ('(/Emails/Email)[1]', 'varchar (200)');

SELECT @email_out; /* Returns xxx&xx@monop.com */

幸運を

ローマ人

于 2012-06-10T08:27:15.717 に答える