Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc

[PL] Wsparcie (?) dla XML w SQL Server 2005

Właśnie przeczytałem ciekawe pytanie na forum CodeGuru.pl (http://codeguru.pl/forum-posts-12220-0.aspx). Kolega zapytał, czy da się w języku T-SQL w SQL Server 2005 wstawić w środek zmiennej typu XML zawartość innej zmiennej typu XML. Pytanie wydaje się naturalne i w sumie oczekiwałbym, że odpowiedź jest trywialna (że się da i to w prosty sposób). Ale okazało się, że nie jest lekko. Otóż...

Typ danych XML dysponuje metodą modify(), która pozwala na modyfikowanie zawartości zmiennych i pól typu XML. Jednym z poleceń XQuery, jakich można użyć wewnątrz wywołania metody modify(), jest polecenie insert. Jednak polecenie to pozwala wstawiać w dowolne właściwie miejsce podanego XML-a tylko literały. To wyklucza jakąkolwiek parametryzację. Zatem SQL Server 2005 nie obsłuży czegoś takiego:

 DECLARE @x XML
SET @x = '<Root></Root>'
DECLARE @t XML
SET @t = '<a><b>asd</b></a>'
SET @x.modify( '
            insert sql:variable("@t")
            as last into (/Root)[1] '
)
SELECT @x

Komunikat błędu nie nastraja optymistycznie:

XQuery: SQL type 'xml' is not supported in XQuery.

Próba użycia zmiennej typu varchar/nvarchar daje inny komunikat:

XQuery [modify()]: Only non-document nodes can be inserted. Found "xs:string ?".

Czyli suma sumarum nic z tego?

Oczywiście, istnieje obejście tego problemu (patrz wspomniany wątek na CodeGuru.pl), ale fakt, że SQL Server 2005 w takich sytuacjach sobie po prostu nie radzi, nieco psuje ogólny wizerunek tego, co szumnie nazywa się "wsparciem dla XML". Na pocieszenie warto wspomnieć, że opisany powyżej przypadek w SQL Server 2008 CTP6 działa bez żadnych "tricków".

Przychodzi mi jeszcze na myśl jedno pytanie. XML jest formatem tekstowym, choć dość speczyficznym oczywiście. Wydawałoby się, że łączenie dwóch fragmentów XML mogłoby się odbywać za pomocą najzwyklejszej konkatenacji. Jednak w SQL Server to nie jest możliwe. Próba wykonania poniższego kodu:

DECLARE @x XML, @y XML
SELECT @x = '<a>a</a>', @y = '<b>b</b>'
SELECT @x + @y

kończy się komunikatem:

Operand data type xml is invalid for add operator.

I na to jest lekarstwo:

DECLARE @x XML, @y XML
SELECT @x = '<a>a</a>', @y = '<b>b</b>'
SELECT @x, @y
FOR XML PATH('')

Co nie zmienia faktu, że dziwi mnie brak operatora konkatenacji dla typu XML w SQL Server (w wersji 2008 CTP6 nie ma nadal tego operatora).

Kończąc, chciałbym zaznaczyć, że wsparcie dla XML w SQL Server 2005 to dla mnie i tak wielki krok naprzód w porównaniu z tym, czym dysponował SQL Server 2000. Na moje potrzeby to wsparcie jest wystarczające (najistotniejsze wydają się: możliwość pobierania zawartości zewnętrznych plików w formacie XML, łatwe i sprawne zapytywanie o dowolne fragmenty dokumentu XML, wsparcie dla walidacji dokumentów XML). Niektórzy twierdzą wręcz, że przechowywanie dokumentów XML w bazach relacyjnych to herezja godząca w podstawowe doktyrny relacyjności (w końcu naruszamy normalizację przez trzymanie złożonych danych w pojedynczych polach). Jednak inni użytkownicy, którzy oczekują pełnej swobody w obsłudze formatu XML w SQL Server, bardziej dosadnie wyrażają swoje opinie na temat wpadek takich, jak opisane w tym wątku (przyklad - tutaj).

Opublikowane 30 marca 2008 16:13 przez brejk
Filed under: ,

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

Brak komentarzy

Co o tym myślisz?

(wymagane) 
wymagane 
(wymagane) 

  
Wprowadź kod: (wymagane)

About brejk

MCT, SQL Server geek