Come posso evitare doppie virgolette negli attributi in una stringa XML in T-SQL?


174

Domanda piuttosto semplice: ho un attributo in cui vorrei avere virgolette doppie. Come posso evitarle? ho provato

  • \"
  • ""
  • \\"

E ho creato la variabile @xml sia per il tipo xml che per varchar (max) per tutti.

 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
A proposito ... non c'è motivo (AFAIK) di usare openxml qui ... è roba "pre-2005". Se hai un valore xml, usalo direttamente come xml.
Marc Gravell

Marc - Grazie. Ho avuto un altro bug che alla fine è stato scoperto che openxml era pieno di apostrofi ricci: 'Penso che lo pubblicherò come una domanda / risposta che Google troverà.
Tom Ritter,

Risposte:


273

Non sarebbe &quot;in XML? vale a dire

"hi &quot;mom&quot; lol" 

** modifica: ** testato; funziona bene:

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 sfugge a una doppia virgoletta con un'altra doppia virgoletta. Quindi se volessi che fosse parte della tua stringa sql letterale, dovresti fare questo:

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

Se si desidera includere una citazione all'interno di un valore nell'xml stesso, utilizzare un'entità, che sarebbe simile a questa:

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

4
È meglio non usare le virgolette doppie come delimitatori di stringhe SQL. Le virgolette singole sono standard ANSI e funzionano sempre, indipendentemente dall'impostazione QUOTED_IDENTIFIER.
Bobince

D'accordo, ma volevo dimostrare che è possibile, nel caso in cui ci fosse confusione su ciò che stava cercando di fare.
Joel Coehoorn,

4

Non posso più commentare ma votato e volevo far sapere alla gente che &quot;funziona molto bene per i file di configurazione XML quando si formano espressioni regex per RegexTransformer in Solr in questo modo: regex=".*img src=&quot;(.*)&quot;.*"usando la versione con escape invece delle doppie virgolette.


2

In Jelly.core per testare una stringa letterale si userebbe:

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

Ma se devo controllare la stringa "Toy's R Us":

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

Sarebbe così se le doppie virgolette fossero ammesse all'interno:

&lt;core:when test="${ name == "Toy's R Us" }"&gt; 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.