Bagaimana cara menghindari tanda kutip ganda dalam atribut dalam String XML di T-SQL?

174

Pertanyaan yang cukup sederhana - Saya memiliki atribut yang ingin saya kutip ganda. Bagaimana cara saya menghindarinya? Saya sudah mencoba

  • \ "
  • ""
  • \\ "

Dan saya telah membuat variabel @xml baik tipe xml dan varchar (maks) untuk semuanya.

 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
sumber
1
Ngomong-ngomong ... tidak ada alasan (AFAIK) untuk menggunakan openxml di sini ... yaitu hal-hal "pra-2005". Jika Anda memiliki nilai xml, gunakan itu sebagai xml secara langsung.
Marc Gravell
Marc - Terima kasih. Saya memiliki bug lain yang akhirnya menjadi openxml penuh dengan tanda kutip keriting: 'Saya pikir saya akan mempostingnya sebagai pertanyaan / jawaban untuk ditemukan oleh google.
Tom Ritter

Jawaban:

273

Bukankah itu &quot;dalam xml? yaitu

"hi &quot;mom&quot; lol" 

Sunting **: ** diuji; bekerja dengan baik:

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

tSql lolos dari penawaran ganda dengan penawaran ganda lainnya. Jadi jika Anda ingin menjadi bagian dari string literal sql Anda, Anda akan melakukan ini:

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

Jika Anda ingin memasukkan kutipan di dalam nilai dalam xml itu sendiri, Anda menggunakan entitas, yang akan terlihat seperti ini:

declare @xml xml
set @xml = "<transaction><item value=""hi &quot;mom&quot; lol"" /></transaction>"
Joel Coehoorn
sumber
4
Lebih baik tidak menggunakan tanda kutip ganda sebagai pembatas string SQL. Kutipan tunggal adalah standar ANSI dan selalu berfungsi, terlepas dari pengaturan QUOTED_IDENTIFIER.
bobince
Setuju, tapi saya ingin menunjukkan bahwa itu mungkin, kalau-kalau ada kebingungan tentang apa yang dia coba lakukan.
Joel Coehoorn
4

Tidak dapat berkomentar lagi tetapi memilihnya dan ingin memberi tahu orang-orang bahwa itu &quot;berfungsi dengan sangat baik untuk file konfigurasi xml ketika membentuk ekspresi regex untuk RegexTransformer di Solr seperti: regex=".*img src=&quot;(.*)&quot;.*"menggunakan versi yang keluar alih-alih tanda kutip ganda.

pulkitsinghal
sumber
2

Dalam Jelly.core untuk menguji string literal yang akan digunakan:

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

Tetapi jika saya harus memeriksa string "Toy's R Us":

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

Akan seperti ini, jika tanda kutip ganda diizinkan di dalam:

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