Làm cách nào để thoát dấu ngoặc kép trong các thuộc tính trong Chuỗi XML trong T-SQL?


174

Câu hỏi khá đơn giản - Tôi có một thuộc tính mà tôi muốn có dấu ngoặc kép. Làm cách nào để thoát chúng? Tôi đã thử

  • \ "
  • ""
  • \ "

Và tôi đã tạo biến @xml cả loại xml và varchar (max) cho tất cả chúng.

 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
Nhân tiện ... không có lý do gì (AFAIK) để sử dụng openxml ở đây ... đó là công cụ "trước năm 2005". Nếu bạn có giá trị xml, hãy sử dụng trực tiếp dưới dạng xml.
Marc Gravell

Marc - Cảm ơn bạn. Tôi đã có một lỗi khác mà cuối cùng là openxml đang bị lỗi với các dấu nháy đơn: 'Tôi nghĩ rằng tôi sẽ đăng nó dưới dạng câu hỏi / câu trả lời để google tìm.
Tom Ritter

Câu trả lời:


273

Điều đó sẽ không có &quot;trong xml? I E

"hi &quot;mom&quot; lol" 

** chỉnh sửa: ** đã kiểm tra; hoạt động tốt:

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 thoát khỏi một trích dẫn kép với một trích dẫn kép khác. Vì vậy, nếu bạn muốn nó là một phần của chuỗi ký tự sql của bạn, bạn sẽ làm điều này:

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

Nếu bạn muốn bao gồm một trích dẫn bên trong một giá trị trong chính xml, bạn sử dụng một thực thể, nó sẽ trông như thế này:

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

4
Tốt nhất không nên sử dụng dấu ngoặc kép làm dấu phân cách chuỗi SQL. Dấu ngoặc đơn là tiêu chuẩn ANSI và luôn hoạt động, bất kể cài đặt QUOTED_IDENTIFIER.
bobince 17/03/2016

Đồng ý, nhưng tôi muốn chứng minh rằng điều đó là có thể, chỉ trong trường hợp có bất kỳ sự nhầm lẫn nào về những gì anh ta đang cố gắng làm.
Joel Coehoorn 17/03/2016

4

Không thể bình luận nữa nhưng đã bình chọn và muốn cho mọi người biết rằng nó &quot;hoạt động rất tốt cho các tệp cấu hình xml khi tạo biểu thức regex cho RegexTransformer trong Solr như vậy: regex=".*img src=&quot;(.*)&quot;.*"sử dụng phiên bản thoát thay vì dấu ngoặc kép.


2

Trong Jelly.core để kiểm tra một chuỗi ký tự, người ta sẽ sử dụng:

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

Nhưng nếu tôi phải kiểm tra chuỗi "Toy's R Us":

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

Nó sẽ như thế này, nếu dấu ngoặc kép được cho phép bên trong:

&lt;core:when test="${ name == "Toy's R Us" }"&gt; 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.