2016-05-17 5 views
0

愚かな質問に対しては申し訳ありませんが、検索してもまだ見つかりませんでした。 (間違った言葉を探しているだけの場合は、コメントを追加して削除して見つけてください)&でXMLタグを取得し、別のXMLフィールドに割り当てるには

短い説明:既存のコードはこのコードを使用しています。私たちが書いたコードを使用して、元のデータから再作成したXMLレコードの一部が消えてしまいました。私たちは、コードが&から&に変換されているという事実に絞っていますが、それは以下のクエリが失敗する原因となり、その理由を理解できません。我々は、この作業を得るためにバンダードとして&の交換を行うためにぎこちない変換を使用していますが、正しく動作させることができます。

ここに私のコードです。 &がなければ動作します。それで、私は「違法な名前の特徴」を得る。どうして?私は(これは、値のメソッドの動作である)&に戻っ

DECLARE @xml_doc XML, @xmlfirst XML 
SET @xml_doc= '<A><B><C>blah &amp; blah</C></B></A>' 
select TOP 1 CAST (X.Y.value('./C[1]', 'varchar(max)') as xml) 
    FROM @xml_doc.nodes('/A/B')X(Y) 
+2

なぜXMLに再度キャストするのですか?キャストなしでこのクエリを実行すると、完全に機能します。 - ' '何とか&何とか' TOP 1 XYvalueを選択 ( './ C [1]'、 'VARCHAR(100)')@ xml_doc.nodes FROM ( '/ A = xml_doc @ SET/B ')X(Y) ' –

答えて

4

説明

X.Y.value('(./C)[1]', 'varchar(4000)')

、デコード&amp;blah &amp; blahあろうテキストとして値を抽出しています。つまり、X.Y.value('(./C)[1]', 'varchar(max)')blah & blahを返します。次にblah & blahをXMLに変換すると、blah & blahは有効なXMLではないため(&&amp;としてエンコードする必要があります)、この「エラー」/例外が生成されます。

溶液#1:あなたは(&amp;)のエンコードされた内部テキストを取得したい場合XML AS

SELECT X.Y.query('./C/text()') 
FROM @xml_doc.nodes('/A/B')X(Y) 

戻りblah &amp; blah

溶液#2:あなたは、デコードされた内部を取得したい場合(&)のテキスト

SELECT X.Y.value('./C[1]', 'VARCHAR(MAX)') 
FROM @xml_doc.nodes('/A/B')X(Y) 

戻りblah & blah

関連する問題