ฉันจะหลีกเลี่ยงอัญประกาศคู่ในแอตทริบิวต์ในสตริง XML ใน T-SQL ได้อย่างไร


174

คำถามที่ค่อนข้างง่าย - ฉันมีคุณลักษณะที่ฉันต้องการให้มีการเสนอราคาสองเท่าฉันจะหนีพวกเขาได้อย่างไร ฉันพยายามแล้ว

  • \"
  • ""
  • \\"

และฉันได้สร้างตัวแปร @xml ทั้งประเภท xml และ varchar (สูงสุด) สำหรับพวกเขาทั้งหมด

 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
โดยวิธีการ ... ไม่มีเหตุผล (AFAIK) ที่จะใช้ openxml ที่นี่ ... นั่นคือสิ่งที่ "pre-2005" หากคุณมีค่า xml ให้ใช้เป็น xml โดยตรง
Marc Gravell

มาร์ค - ขอบคุณ ฉันมีข้อผิดพลาดอื่น ๆ ที่จบลงด้วยการเป็น openxml ที่เต็มไปด้วย apostrophes หยิก: 'ฉันคิดว่าฉันจะโพสต์มันเป็นคำถาม / คำตอบสำหรับ google เพื่อค้นหา
Tom Ritter

คำตอบ:


273

ไม่ว่าจะเป็น&quot;xml หรือไม่? กล่าวคือ

"hi &quot;mom&quot; lol" 

** แก้ไข: ** ทดสอบแล้ว; ทำงานได้ดี:

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 หนีคำพูดสองครั้งด้วยคำพูดคู่อื่น ดังนั้นหากคุณต้องการให้มันเป็นส่วนหนึ่งของสตริง sql ที่แท้จริงคุณจะทำสิ่งนี้:

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

หากคุณต้องการรวมเครื่องหมายคำพูดไว้ในค่าในตัว xml คุณต้องใช้เอนทิตีซึ่งจะมีลักษณะดังนี้:

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

4
ไม่ควรใช้เครื่องหมายคำพูดคู่เป็นตัวคั่นสตริง SQL อัญประกาศเดี่ยวเป็นมาตรฐาน ANSI และสามารถใช้งานได้เสมอโดยไม่คำนึงถึงการตั้งค่า QUOTED_IDENTIFIER
bobince

เห็นด้วย แต่ฉันต้องการแสดงให้เห็นว่าเป็นไปได้ในกรณีที่มีความสับสนเกี่ยวกับสิ่งที่เขาพยายามทำ
Joel Coehoorn

4

ไม่สามารถแสดงความคิดเห็นได้อีกต่อไป แต่ลงคะแนนและต้องการให้ผู้ใช้ทราบว่า&quot;ทำงานได้ดีมากสำหรับไฟล์ xml config เมื่อสร้างนิพจน์ regex สำหรับ RegexTransformer ใน Solr ดังนี้: regex=".*img src=&quot;(.*)&quot;.*"ใช้เวอร์ชัน escaped แทนเครื่องหมายคำพูดคู่


2

ใน Jelly.core เพื่อทดสอบสตริงตัวอักษรหนึ่งที่จะใช้:

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

แต่ถ้าฉันต้องตรวจสอบสตริง "Toy's R Us":

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

มันจะเป็นแบบนี้ถ้าอนุญาตให้ใส่เครื่องหมายคำพูดคู่ภายใน:

&lt;core:when test="${ name == "Toy's R Us" }"&gt; 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.