Comment échapper les guillemets doubles dans les attributs d'une chaîne XML dans T-SQL?

174

Question assez simple - j'ai un attribut dans lequel j'aimerais avoir des guillemets. Comment puis-je les échapper? J'ai essayé

  • \ "
  • ""
  • \\ "

Et j'ai créé la variable @xml à la fois de type xml et varchar (max) pour tous.

 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
la source
1
Au fait ... il n'y a aucune raison (AFAIK) d'utiliser openxml ici ... c'est des trucs "d'avant 2005". Si vous avez une valeur xml, utilisez-la directement comme xml.
Marc Gravell
Marc - Merci. J'ai eu un autre bogue qui a fini par être openxml qui cassait avec des apostrophes bouclées: `` Je pense que je vais le publier comme une question / réponse que Google pourra trouver.
Tom Ritter

Réponses:

273

Ne serait-ce pas &quot;en XML? c'est à dire

"hi &quot;mom&quot; lol" 

** modifier: ** testé; fonctionne 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
la source
4

Le tSql échappe un guillemet double avec un autre guillemet double. Donc, si vous vouliez qu'il fasse partie de votre littéral de chaîne sql, vous feriez ceci:

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

Si vous souhaitez inclure une citation à l'intérieur d'une valeur dans le xml lui-même, vous utilisez une entité, qui ressemblerait à ceci:

declare @xml xml
set @xml = "<transaction><item value=""hi &quot;mom&quot; lol"" /></transaction>"
Joël Coehoorn
la source
4
Il est préférable de ne pas utiliser de guillemets doubles comme délimiteurs de chaînes SQL. Les guillemets simples sont conformes à la norme ANSI et fonctionnent toujours, quel que soit le paramètre QUOTED_IDENTIFIER.
bobince
D'accord, mais je voulais montrer que c'est possible, juste au cas où il y aurait une confusion sur ce qu'il essayait de faire.
Joel Coehoorn
4

Je ne peux plus commenter mais j'ai voté et je voulais faire savoir aux gens que cela &quot;fonctionne très bien pour les fichiers de configuration xml lors de la formation d'expressions regex pour RegexTransformer dans Solr comme ceci: en regex=".*img src=&quot;(.*)&quot;.*"utilisant la version échappée au lieu de guillemets doubles.

pulkitsinghal
la source
2

Dans Jelly.core pour tester une chaîne littérale, on utiliserait:

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

Mais si je dois vérifier la chaîne "Toy's R Us":

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

Ce serait comme ceci, si les guillemets étaient autorisés à l'intérieur:

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