T-SQLのXML文字列の属性で二重引用符をエスケープするにはどうすればよいですか?


174

かなり単純な質問-二重引用符を使用したい属性があります。それらをエスケープするにはどうすればよいですか?私はもう試した

  • 「」
  • 「」
  • \\ "

そして、@ xml変数をxmlタイプとそれらすべてのvarchar(max)の両方にしました。

 declare @xml xml --(or varchar(max) tried both)

 set @xml = '<transaction><item value="hi "mom" lol" 
    ItemId="106"  ItemType="2"  instanceId="215923801"  dataSetId="1" /></transaction>'

 declare @xh int
 exec sp_xml_preparedocument @xh OUTPUT, @xml

 insert into @commits --I declare the table, just removed it for brevity
 select
    x.*
 from openxml(@xh,'/transaction/item')
  WITH (
    dataItemId int,
     dataItemType int,
    instanceId int,
    dataSetId int,
    value varchar(max)
  ) x

1
ちなみに...ここではopenxmlを使用する理由(AFAIK)はありません...これは「2005より前」のものです。xml値がある場合は、それを直接xmlとして使用します。
Marc Gravell

マーク-ありがとう。私はopenxmlがカーリーアポストロフィでつぶれていた別のバグがありました。
トムリッター

回答:


273

それは&quot;xmlではないでしょうか?すなわち

"hi &quot;mom&quot; lol" 

**編集:**テスト済み。正常に動作します:

declare @xml xml

 set @xml = '<transaction><item value="hi &quot;mom&quot; lol" 
    ItemId="106"  ItemType="2"  instanceId="215923801"  dataSetId="1" /></transaction>'

select @xml.value('(//item/@value)[1]','varchar(50)')

4

tSqlは、二重引用符を別の二重引用符でエスケープします。したがって、SQL文字列リテラルの一部にしたい場合は、次のようにします。

declare @xml xml 
set @xml = "<transaction><item value=""hi"" /></transaction>"

xml自体の値の中に引用符を含める場合は、次のようなエンティティを使用します。

declare @xml xml
set @xml = "<transaction><item value=""hi &quot;mom&quot; lol"" /></transaction>"

4
ただし、SQL文字列の区切り文字として二重引用符を使用しないことをお勧めします。単一引用符はANSI標準であり、QUOTED_IDENTIFIER設定に関係なく常に機能します。
ボビンス2009年

同意しましたが、彼が何をしようとしていたのか混乱があった場合に備えて、それが可能であることを実証したいと思いました。
Joel Coehoorn 2009年

4

コメントはもうできませんが、投票して&quot;、SolrでRegexTransformerの正規表現を作成するときにxml構成ファイルで非常にうまく機能することを伝えたいと思いましたregex=".*img src=&quot;(.*)&quot;.*"。二重引用符の代わりにエスケープバージョンを使用します。


2

Jelly.coreでリテラル文字列をテストするには、次のようにします。

&lt;core:when test="${ name == 'ABC' }"&gt; 

しかし、文字列 "Toy's R Us"を確認する必要がある場合:

&lt;core:when test="${ name == &amp;quot;Toy&apos;s R Us&amp;quot; }"&gt;

内部で二重引用符が許可されている場合は、次のようになります。

&lt;core:when test="${ name == "Toy's R Us" }"&gt; 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.