Як уникнути подвійних лапок в атрибутах у XML-рядку в T-SQL?


174

Досить просте запитання - у мене є атрибут, про який я хотів би мати подвійні лапки. Як я їх уникаю? Я намагався

  • \ "
  • ""
  • \\ "

І я створив змінну @xml як тип xml, так і varchar (max) для всіх.

 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 ... це речі "до 2005 року". Якщо у вас є значення xml, використовуйте його як xml безпосередньо.
Марк Гравелл

Марк - дякую. У мене з'явилася ще одна помилка, яка в кінцевому підсумку виявилася openxml, перебита кучерявими апострофами: "Я думаю, я збираюся розмістити це як питання / відповідь для пошуку Google.
Том Ріттер

Відповіді:


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, коли формує вирази регулярних виразів для RegexTransformer в Solr, як: regex=".*img src=&quot;(.*)&quot;.*"використання втеченої версії замість подвійних лапок.


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; 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.