W ostatnim wpisie pokazałem, czym jest XML i wspomniałem o kilku ciekawych (przynajmniej tak mi się wydaje) rzeczach z tym związanych. Nie jest to takie seksowne jak LESSy czy SASSy, a wręcz przeciwnie. Niemniej jednak jest przydatne i wykorzystywane, a przecież czytacie mnie dla wiedzy, a nie podrywania na programowanie. Mam nadzieję, że nikogo nie zawiodłem.

FOR XML

Zaczniemy od baz danych i MS SQL Server. Mamy tu dostępny typ danych XML, który umożliwia przechowywanie tychże dokumentów. Po co taki plik skoro mamy tabelki? Otóż wiersz w tabeli ma z góry określone kolumny, a dokument XML nie. Możemy zatem do komórki dodać dowolnie przetworzony wynik zapytania bądź dane z zewnątrz.

Do czego może nam się to przydać? W pracy obecnie piszę narzędzie do logowania dodawanych wierszy do bazy danych.

Mamy tu 3 podejścia:

  • dodawanie kolejnych wierszy do oryginalnej tabeli – niestety rozwiązanie ma bardzo dużo wad (dodatkowa kolumna na trzymanie wersji wiersza, wyszukiwanie wiersza itp. Itd.), sprawdzi się zapewne przy małych bazach,
  • kopia oryginalnej tabeli, w której trzymamy wszystkie stare wersje wiersza, a w oryginalnej bazie trzymamy jego najnowszą wersję – rozwiązanie ciekawe, ma sporo zalet, korzysta z niego wiele banków, więc na pewno jest sprawdzone,
  • jedna tabela, aby rządzić wszystkimi – czyli mamy jedną tabelę i w niej trzymamy całą historię bazy danych.

Wybrałem bramkę numer 3, ponieważ baza danych jest bardzo duża, więc opcja pierwsza odpada. Kopia oryginalnej tabeli też by się nie sprawdziła, ponieważ tabel jest kilkaset, co spowodowałoby znaczące powiększenie bazy danych. Padło więc na jedną tabelę i wykorzystanie XML.

Identyfikator nowo dodawanego wiersza trafia do XML, który później ląduje w tabeli logów. Jeśli usuwamy wiersz, to również pakujemy go do dokumentu XML i wrzucamy do tej samej kolumny, co w przypadku informacji o insercie. Jeśli aktualizujemy jakieś komórki, to do XMLa trafia stara i nowa wartość z informacją o kolumnie. Dzięki temu jedna tabela jest uniwersalna i nie musimy pamiętać całego wiersza.

Jak zatem stworzyć XML w bazie danych?

Microsoft udostępnia nam frazę FOR XML:

To spowoduje zapakowanie całego wyniku do dokumentu XML, który zostanie zwrócony. Bardzo proste i wygodne rozwiązanie.

Należy pamiętać o kolejności zapisywania i wykonywania. FOR XML zapisujemy zawsze na końcu zapytania, czyli nawet po klauzuli ORDER BY. Silnik bazy danych również wykonuje tę operację na końcu.

Jest to prosty sposób na tworzenie dokumentów XML po stronie bazy danych. Jak to zrobić w aplikacji przedstawię w kolejnych wpisach. Natomiast to jak ja rozwiązałem problem z logowaniem i tworzeniem dokumentów XML to trochę grubszy temat, więc krok po kroku opiszę najczęściej wykorzystywane mechanizmy. Zatem do przeczytania!