web-dev-qa-db-fra.com

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

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

  • \ "
  • ""
  • \\ "

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

 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
171
Tom Ritter

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

tSql échappe à une citation double avec une autre citation double. Donc, si vous vouliez qu'il fasse partie de votre littéral chaîne SQL, procédez comme suit:

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

Si vous souhaitez inclure une citation à l'intérieur d'un 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>"
4
Joel Coehoorn

Je ne peux plus commenter, mais je l'ai voté et je voulais que les gens sachent que &quot; fonctionnait très bien pour les fichiers de configuration XML lors de la formation d'expressions regex pour RegexTransformer dans Solr, comme ceci: regex=".*img src=&quot;(.*)&quot;.*" en utilisant la version échappée au lieu de double -citations.

4
pulkitsinghal

Dans Jelly.core, pour tester une chaîne littérale, vous utiliseriez:

&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 ça, si les guillemets étaient autorisés à l'intérieur:

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