2009-03-16 17 views
165

Pregunta bastante simple: tengo un atributo en el que me gustaría tener comillas dobles. ¿Cómo puedo escapar de ellas? He intentado¿Cómo escapo las comillas dobles en atributos en una cadena XML en T-SQL?

  • \ "
  • ""
  • \\"

Y he hecho la variable @xml tanto de tipo xml y 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 
+1

Por cierto ... no hay ninguna razón (AFAIK) para usar openxml aquí ... eso es "pre-2005". Si tiene un valor xml, úselo como xml directamente. –

+0

Marc - Gracias. Tenía otro error que terminaba siendo openxml estaba reventado con apóstrofes rizados: 'Creo que voy a publicarlo como una pregunta/respuesta para que google encuentre. –

Respuesta

266

¿No sería &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)') 
+4

" funciona bien en XAML también. –

4

tSql escapa una comilla doble con otra comilla doble. Así que si quería que fuera parte de su cadena SQL literal podría hacer esto:

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

Si desea incluir una cita dentro de un valor en el propio XML, se utiliza una entidad, que se vería de esta manera:

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

Mejor no utilizar comillas dobles como delimitadores de cadena SQL. Las comillas simples son estándares ANSI y siempre funcionan, independientemente de la configuración QUOTED_IDENTIFIER. – bobince

+0

Estoy de acuerdo, pero quería demostrar que es posible, en caso de que haya alguna confusión sobre lo que estaba tratando de hacer. –

2

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

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

Pero si tengo que comprobar la cadena "de Toy R Us":

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

Sería como esto, si las comillas dobles se les permitió el interior:

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

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

+0

Recuerde, siempre dar una razón para un downvote le ayuda a parecer un duende y mejora la calidad de la discusión. – pulkitsinghal

Cuestiones relacionadas