Wie entkomme ich doppelte Anführungszeichen in Attributen in einer XML-Zeichenfolge in T-SQL?

174

Ziemlich einfache Frage - Ich habe ein Attribut, in dem ich doppelte Anführungszeichen haben möchte. Wie entkomme ich ihnen? ich habe es versucht

  • ""
  • ""
  • \\ "

Und ich habe die Variable @xml sowohl für den XML-Typ als auch für varchar (max) für alle erstellt.

 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
quelle
1
Übrigens ... es gibt keinen Grund (AFAIK), hier openxml zu verwenden ... das ist "vor 2005". Wenn Sie einen XML-Wert haben, verwenden Sie ihn direkt als XML.
Marc Gravell
Marc - Danke. Ich hatte einen anderen Fehler, der schließlich zu openxml führte, und war voller geschweifter Apostrophe: „Ich denke, ich werde ihn als Frage / Antwort für Google veröffentlichen.
Tom Ritter

Antworten:

273

Wäre das nicht &quot;in XML? dh

"hi &quot;mom&quot; lol" 

** bearbeiten: ** getestet; funktioniert gut:

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
quelle
4

tSql entgeht einem doppelten Anführungszeichen mit einem anderen doppelten Anführungszeichen. Wenn Sie also möchten, dass es Teil Ihres SQL-String-Literals ist, würden Sie Folgendes tun:

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

Wenn Sie ein Anführungszeichen in einen Wert in der XML selbst einfügen möchten , verwenden Sie eine Entität, die folgendermaßen aussehen würde:

declare @xml xml
set @xml = "<transaction><item value=""hi &quot;mom&quot; lol"" /></transaction>"
Joel Coehoorn
quelle
4
Verwenden Sie jedoch am besten keine doppelten Anführungszeichen als SQL-Zeichenfolgenbegrenzer. Einfache Anführungszeichen sind ANSI-Standard und funktionieren unabhängig von der Einstellung QUOTED_IDENTIFIER immer.
Bobince
Einverstanden, aber ich wollte zeigen, dass es möglich ist, nur für den Fall, dass es Verwirrung darüber gibt, was er versucht hat.
Joel Coehoorn
4

Kann nicht mehr kommentieren, stimmte aber ab und wollte die Leute wissen lassen, dass dies &quot;sehr gut für die XML-Konfigurationsdateien funktioniert, wenn Regex-Ausdrücke für RegexTransformer in Solr wie folgt erstellt werden: regex=".*img src=&quot;(.*)&quot;.*"Verwenden der Escape- Version anstelle von doppelten Anführungszeichen.

pulkitsinghal
quelle
2

In Jelly.core würde man zum Testen einer Literalzeichenfolge Folgendes verwenden:

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

Aber wenn ich nach der Zeichenfolge "Toy's R Us" suchen muss:

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

Es wäre so, wenn die doppelten Anführungszeichen drinnen erlaubt wären:

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