2010-07-27 13 views
5

Czy istnieje sposób na uzyskanie wersji xml-safe kolumny xml w serwerze sql?Jak uzyskać bezpieczną dla XML wersję kolumny XML serwera sql

przez XML-Safe Znaczy ucieczki znaków specjalnych jak <,>, "& itp

Chciałbym uniknąć robi zamienników siebie. Czy istnieje funkcja kompilacji w serwerze sql.

Co chcę osiągnąć, to przechowywać treści XML w innym atrybucie xml.

+3

"xml-safe" ?? Co przez to rozumiesz?? Wyjaśnij - nie jest to powszechnie używane wyrażenie w mojej opinii .... –

+0

Co masz na myśli mówiąc "unikaj zastępowania siebie"? Czym jest to "zastąp", o którym mówisz? – NotMe

+0

Założę się, że on myśli, że musi przetłumaczyć '<' na '<', na przykład. –

Odpowiedz

8

Zakładam, że przez xml-safe rozumiesz ucieczkę specjalnych znaczników XML. Jeśli masz kolumny XML, który chcesz umieścić w innym dokumencie XML to masz dwie opcje:

  • projektu kolumna jako [*]: select ..., xmlcolumn as [*], ... from ... for xml path... będzie osadzać zawartość XML w kolumnie XML wynikowej. Na przykład. jeśli kolumna ma wartość <element>value</element>, wynik będzie podobny do <root><row><element>value</element></row></root>.
  • wyświetlać kolumnę jako nazwę kolumny: select ..., xmlcolumn, ... from ... for xml path... spowoduje to wstawienie zawartości kolumny jako wartości (tj. Na przykład. taka sama wartość jak powyżej spowoduje wygenerowanie <root><row><xmlcolumn>&lt;element&gt;&lt;value&lt;/element&gt;.

Jeśli twoje pytanie dotyczy czegoś innego, to musisz je odpowiednio sformułować i poprawnie używać terminów. Nie wynajduj nowych terminów, których nikt nie rozumie, ale ty.

Aktualizacja:

Jeśli wstawiasz wartości XML w kolumnie, to nie trzeba robić nic w ogóle. Biblioteki klienta wiedzą, jak radzić sobie z odpowiednim ucieczką. Tak długo, jak piszesz swój kod poprawnie. Pamiętaj, XML to NOT ciąg znaków i nigdy nie powinien być traktowany jako jeden. Jeśli piszesz XML w swoim kliencie, użyj odpowiedniej biblioteki XML (XmlWriter, XML DOM, , , ,itd.). przechodząc w XML do SQL Server, użyj odpowiedniego typu: SqlXml. Procedury przechowywane powinny używać odpowiedniego parametru: XML. Po jej przeczytaniu użyj odpowiedniej metody, aby odczytać XML: GetSqlXml(). To samo dotyczy deklarowania typu w jednym z projektantów miriad (LINQ do SQL, EF itp.). Ostatecznie, istnieje potrzeba uniknięcia unikania znaków XML ręcznie. Jeśli to robisz, używasz niewłaściwego API i musisz wrócić do deski kreślarskiej.

Dobry początek czytania to XML Support in Microsoft SQL Server 2005.

I wreszcie, aby manipulować XML jako opisać (aktualizacja XML kolumnie tabeli A z kolumny XML w tabeli B), należy użyć XML methods konkretnie modify (... insert...) i powiązać kolumnę tabeli B wewnątrz XQuery za pomocą sql:column:

update A 
set somecolumn.modify('insert {sql:column("B.othercolumn")} before somenode') 
from A join B on ...; 

W swoim komentarzu zagrażasz XMLowi jako ciągowi znaków i, jak już powiedziałem, nigdy nie powinieneś tego robić: łańcuchy i XML są jak woda i olej.

2

Zawartość kolumny XML to XML. Z definicji jest to "bezpieczne dla XML".

Czy należy uwzględnić kod XML z kolumny w elemencie XML lub atrybucie innego dokumentu XML? Następnie zapisz zewnętrzny plik XML jako ciąg w nowym dokumencie.

+1

Potrzebuję wziąć XML i wstawiony do atrybutu XML.Mam tabeli A, która zawiera kolumnę XML i Tabela B, że również zawierają kolumnę XML.Muszę pobrać XML z tabeli B i przechowywać go w atrybucie zawartości xml z tabeli A. Próbowałem zrobić "" ale to nie zadziała, ponieważ tableBxmlContent zawiera <, > itd ... – pdiddy

10

Nie jest to bezpośrednia odpowiedź na to pytanie, ale dla każdego, kto próbuje ciągów xml-ewakuacyjnych w TSQL, tutaj jest trochę funkcja pisałem:

CREATE FUNCTION escapeXml 
(@xml nvarchar(4000)) 
RETURNS nvarchar(4000) 
AS 
BEGIN 
    declare @return nvarchar(4000) 
    select @return = 
    REPLACE(
     REPLACE(
      REPLACE(
       REPLACE(
        REPLACE(@xml,'&', '&amp;') 
       ,'<', '&lt;') 
      ,'>', '&gt;') 
     ,'"', '&quot;') 
    ,'''', '&#39;') 

return @return 
end 
GO 
+0

Dokładnie tego, czego szukałem, dzięki! –

4

Innym prostszym sposobem xml uciec ciąg jest Aby użyć następującego:

SELECT @String FOR XML PATH('') 

np.

DECLARE @Input NVARCHAR(4000) = 'bacon & eggs' 
DECLARE @String = (SELECT @Input FOR XML PATH('')) 

następnie użyć @string stamtąd

+0

Niezły sposób na przekształcenie oleju w wodę! – brewmanz