Jak uniknąć podwójnych cudzysłowów w atrybutach w ciągu XML w T-SQL?


174

Dość proste pytanie - mam atrybut, w którym chciałbym mieć podwójne cudzysłowy. Jak przed nimi uciec? próbowałem

  • \ "
  • „”
  • \\ ”

I utworzyłem zmienną @xml zarówno typu xml, jak i varchar (max) dla nich wszystkich.

 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
Nawiasem mówiąc ... nie ma powodu (AFAIK), aby używać tutaj openxml ... to jest rzeczy „sprzed 2005 roku”. Jeśli masz wartość XML, użyj jej bezpośrednio jako XML.
Marc Gravell

Marc - Dziękuję. Miałem inny błąd, który skończył się jako openxml, który wypełniał kręcone apostrofy: `` Myślę, że opublikuję to jako pytanie / odpowiedź do znalezienia przez Google.
Tom Ritter,

Odpowiedzi:


273

Czy nie byłoby to &quot;w formacie xml? to znaczy

"hi &quot;mom&quot; lol" 

** edycja: ** testowane; działa w porządku:

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 wymyka podwójny cudzysłów innym podwójnym cudzysłowem. Więc jeśli chcesz, aby był on częścią twojego literału ciągu sql, zrobiłbyś to:

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

Jeśli chcesz zawrzeć cytat wewnątrz wartości w samym xml, użyj encji, która wyglądałaby następująco:

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

4
Najlepiej jednak nie używać podwójnych cudzysłowów jako separatorów łańcuchów SQL. Pojedyncze cudzysłowy są standardem ANSI i zawsze działają, niezależnie od ustawienia QUOTED_IDENTIFIER.
bobince

Zgoda, ale chciałem pokazać, że jest to możliwe, na wypadek gdyby było jakieś zamieszanie co do tego, co próbował zrobić.
Joel Coehoorn

4

Nie mogę już komentować, ale zagłosowałem na to i chciałem dać ludziom znać, że &quot;działa bardzo dobrze dla plików konfiguracyjnych xml podczas tworzenia wyrażeń regex dla RegexTransformer w Solr, tak jak to: regex=".*img src=&quot;(.*)&quot;.*"używając wersji ze znakami ucieczki zamiast podwójnych cudzysłowów.


2

W Jelly.core do testowania dosłownego ciągu znaków należałoby użyć:

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

Ale jeśli muszę sprawdzić ciąg „Toy's R Us”:

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

Byłoby tak, gdyby dozwolone były podwójne cudzysłowy:

&lt;core:when test="${ name == "Toy's R Us" }"&gt; 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.