如何在T-SQL的XML字符串的属性中转义双引号?


174

很简单的问题-我有一个属性,希望在其中使用双引号。如何转义它们?我试过了

  • \“
  • \\“

我为所有它们都设置了@xml变量xml type和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
顺便说一下...这里没有理由(AFAIK)使用openxml ...那是“ 2005年前”的东西。如果您有xml值,请直接将其用作xml。
Marc Gravell

马克-谢谢。我还有另一个错误,最终导致openxml出现了卷曲的撇号:'我想我将它发布为一个问题/答案,供Google查找。
Tom Ritter

Answers:


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设置如何,始终可以使用。
bobince

同意,但是我想证明这是有可能的,以防万一他想做的事情有任何困惑。
乔尔·科恩荷恩

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; 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.