¿Cómo escapo las comillas dobles en los atributos en una cadena XML en T-SQL?

174

Pregunta bastante simple: tengo un atributo en el que me gustaría tener comillas dobles. ¿Cómo puedo escapar de ellas? He intentado

  • \ "
  • ""
  • \\ "

Y he hecho la variable @xml tanto tipo xml como varchar (max) para todos ellos.

 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
Tom Ritter
fuente
1
Por cierto ... no hay ninguna razón (AFAIK) para usar openxml aquí ... eso es "anterior a 2005". Si tiene un valor xml, úselo directamente como xml.
Marc Gravell
Marc: gracias. Tuve otro error que terminó siendo openxml estaba reventando con apóstrofos rizados: 'Creo que voy a publicarlo como una pregunta / respuesta para que Google lo encuentre.
Tom Ritter

Respuestas:

273

¿No sería eso &quot;en xml? es decir

"hi &quot;mom&quot; lol" 

** editar: ** probado; funciona bien:

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)')
Marc Gravell
fuente
4

tSql escapa a una comilla doble con otra comilla doble. Entonces, si quisieras que sea parte de tu literal de cadena sql, harías esto:

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

Si desea incluir una cita dentro de un valor en el propio xml, use una entidad, que se vería así:

declare @xml xml
set @xml = "<transaction><item value=""hi &quot;mom&quot; lol"" /></transaction>"
Joel Coehoorn
fuente
44
Sin embargo, es mejor no usar comillas dobles como delimitadores de cadenas SQL. Las comillas simples son estándar ANSI y siempre funcionan, independientemente de la configuración QUOTED_IDENTIFIER.
bobince
De acuerdo, pero quería demostrar que es posible, en caso de que hubiera alguna confusión sobre lo que estaba tratando de hacer.
Joel Coehoorn el
4

No puedo comentar más, pero lo voté y quería que la gente supiera que &quot;funciona muy bien para los archivos de configuración xml al formar expresiones regex para RegexTransformer en Solr de la siguiente manera: regex=".*img src=&quot;(.*)&quot;.*"usando la versión escapada en lugar de comillas dobles.

pulkitsinghal
fuente
2

En Jelly.core para probar una cadena literal, se usaría:

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

Pero si tengo que verificar la cadena "Toy's R Us":

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

Sería así, si se permitieran las comillas dobles en el interior:

&lt;core:when test="${ name == "Toy's R Us" }"&gt; 
marca
fuente