Professional Documents
Culture Documents
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
O autorach ..................................................................................... 15
O redaktorach technicznych ........................................................... 19
Wprowadzenie ................................................................................ 21
Rozdzia 1. Przegld funkcji i instalacja SQL Servera ......................................... 27
Historia rozwoju SQL Servera ........................................................................................ 27
Przegld funkcji SQL Servera 2005 ................................................................................ 28
Wydania .................................................................................................................... 30
Funkcje ...................................................................................................................... 31
Instalacja .......................................................................................................................... 35
Minimalne wymagania systemowe ........................................................................... 35
Proces instalacji ......................................................................................................... 37
Rejestracja serwera .................................................................................................... 47
Przykadowe bazy danych ......................................................................................... 49
Instalacja dwch rwnolegych instancji .................................................................. 50
Uaktualnianie baz danych SQL Servera 2000 i 7.0 ......................................................... 51
Podsumowanie ................................................................................................................. 51
Spis treci
7
Doczanie i usuwanie tabel z partycji .................................................................... 169
Zarzdzanie partycjami tabel i indeksw ................................................................ 170
Rozszerzenia tabel i widokw ....................................................................................... 171
Rozszerzenia w widokach indeksowanych ............................................................. 171
Stae kolumny obliczane ......................................................................................... 172
Migawki ......................................................................................................................... 173
Poziom izolacji transakcji SNAPSHOT .................................................................. 173
Migawki baz danych ............................................................................................... 178
Rozszerzenia w zakresie integralnoci danych .............................................................. 180
Weryfikacja stron bazy danych ............................................................................... 180
Przeczanie bazy danych w tryb awaryjny ............................................................ 181
Podsumowanie ............................................................................................................... 182
Spis treci
9
Zapytania na danych XML ............................................................................................ 331
Podstawy jzyka XQuery ........................................................................................ 332
Podstawowe metody zapyta XML ........................................................................ 338
Zapytania midzydomenowe ................................................................................... 340
Modyfikowanie danych XML ....................................................................................... 341
Ograniczenia zakresu modyfikacji danych XML .................................................... 342
Indeksowanie danych XML w celu zwikszenia wydajnoci ....................................... 343
Sposb dziaania indeksw na danych XML .......................................................... 344
Drugorzdne indeksy XML ..................................................................................... 345
Przeszukiwanie penotekstowe a typ danych XML ....................................................... 346
Dynamiczne widoki zarzdcze i dane XML .................................................................. 347
Aplikacje i dane XML ................................................................................................... 348
Obsuga usug sieciowych XML ................................................................................... 349
Tworzenie wza kocowego .................................................................................. 350
Uywanie zaawansowanych usug sieciowych ....................................................... 356
Monitorowanie wydajnoci usug sieciowych XML .............................................. 361
Podsumowanie ............................................................................................................... 362
10
Spis treci
11
Obiekty zabezpieczajce i obiekty zabezpieczane ........................................................ 483
Obiekty zabezpieczajce ......................................................................................... 483
Obiekty zabezpieczane ............................................................................................ 493
Uprawnienia ................................................................................................................... 496
Typy uprawnie ....................................................................................................... 496
Zarzdzanie uprawnieniami .................................................................................... 498
Code Access Security .................................................................................................... 502
Imperatywna i deklaratywna implementacja CAS .................................................. 502
Uycie CAS z SQL Serverem ................................................................................. 503
Szyfrowanie ................................................................................................................... 507
Hierarchia szyfrowania w SQL Serverze 2005 ....................................................... 508
Szyfrowanie hasem podanym przez uytkownika ................................................. 509
Szyfrowanie kluczem symetrycznym ...................................................................... 510
Szyfrowanie kluczem asymetrycznym .................................................................... 511
Szyfrowanie certyfikatem ....................................................................................... 512
Certyfikaty i usugi sieciowe ......................................................................................... 513
Podsumowanie ............................................................................................................... 516
12
Spis treci
13
Przegldarki danych ................................................................................................ 685
Okno punktw przerwa ......................................................................................... 686
Inne okna debugowania ........................................................................................... 687
Narzdzie SSIS Package Deployment Utility ............................................................... 687
Wykonywanie migracji pakietw SQL Servera 2000 ................................................... 688
Tworzenie harmonogramw pakietu SSIS .................................................................... 688
Podsumowanie ............................................................................................................... 689
14
Rozdzia 7.
Popularno jzyka XML wzrasta z kadym dniem. Niektrzy zdeklarowani zwolennicy koncepcji relacyjnej krc z dezaprobat gowami, gdy sysz o XML-u. Jednak
tak naprawd XML stanowi uzupenienie technologii relacyjnych, a dane XML s
w wikszoci ustrukturyzowane jak dane relacyjne. Czy to dobrze? Pewnie nie, poniewa obydwa modele sprawdzaj si najlepiej w przypadku danych, dla ktrych
zostay stworzone: XML dla danych na wp ustrukturyzowanych, a relacyjne bazy
danych dla danych relacyjnych. Ponadto semantyka mechanizmw przechowywania,
odpytywania i modyfikowania danych XML czsto sprawia kopot osobom preferujcym podejcie relacyjne. Jak si przekonamy, XQuery w niczym nie przypomina
jzyka T-SQL, jednak obydwu technologii mona uywa cznie, aby rozwizywa
problemy biznesowe. Zanim zagbimy si w nowe mechanizmy obsugi XML-a
dostpne w SQL Serverze 2005, musimy jednak najpierw zrozumie, czym jest XML
i w jaki sposb SQL Server ju obsuguje technologi XML.
Na pocztku niniejszego rozdziau zajmiemy si rzeczami podstawowymi: czym jest
XML i w jaki sposb aktualna wersja SQL Servera obsuguje XML za pomoc FOR XML,
rozdrabniania danych XML i wsparcia FOR XML z poziomu .NET Framework. Opisane
zostanie rwnie XPath oraz zakres obsugi XPath wiadczonej przez SQL Server. Na
koniec przyjrzymy si SQLXML oraz pokaemy sposb, w jaki mona uy tej technologii do rozszerzenia zakresu obsugi XML-a przez SQL Server. Jeli uytkownik
nie posiada SQLXML, wersj 3.0 dla SQL Servera 2000 mona pobra za darmo
z sieci WWW, natomiast wersja 4.0 jest doczona do SQL Servera 2005. W nastpnym rozdziale zobaczymy, w jaki sposb SQL Server zacz obsugiwa klauzul FOR
XML z nowym typem danych XML oraz jzykiem XQuery. Zajmiemy si take obsug
usug sieciowych WWW, ktra zastpia obsug usug sieciowych ISAPI SQLXML.
270
danych przy uyciu standaryzowanych schematw. Standaryzacja jest wanie najwaniejsz cech, poniewa z niej wypywa sia XML-a. Kady inny system potrafi
odczytywa i zapisywa dane zgodne ze standardem, oczywicie uwzgldniajc fakt,
e niektre systemy mog czasami odmiennie interpretowa dane. XML rwnie pozwala
na pozyskiwanie danych XML przy uyciu standardu XPath i przeksztacanie danych
XML z zastosowaniem XSLT. Obydwa standardy zostan opisane w dalszej czci tego
rozdziau.
Ciekaw kwesti jest dokonanie wyboru midzy danymi XML i danymi relacyjnymi.
Co jaki czas na nowo rozpoczyna si dyskusja na temat przechowywania danych
w klasycznym standardzie relacyjnym, w hybrydowym modelu XML/relacyjnym oraz
w czystym formacie XML. Naszym zdaniem najlepiej jest wybiera rozwizanie, ktre
najbardziej przydaje si do rozwizania danego problemu. Uytkownicy specjalizujcy
si w technologiach relacyjnych, ktrzy potrafi zapewni wysok wydajno przetwarzania danych relacyjnych, nie maj powodw, by przestawi si na uywanie
rozwiza XML-owych. Dane relacyjne mona bez trudu udostpnia dla wiata zewntrznego w postaci XML przy uyciu FOR XML, natomiast wewntrznie dane mog
nadal by przechowywane w modelu relacyjnym. Niewarto ulega zachwytom nad
XML-em bez wyranego powodu. Na przykad dane XML maj charakter tekstowy,
a wic ich rozmiar jest wikszy ni rozmiar binarnych odpowiednikw. XML jest
rwnie rozwleky, poniewa nie jest znormalizowany jak dane relacyjne, a przez to
w jednym dokumencie mog si powtarza sekcje tych samych danych. Ponadto model
programistyczny XML-a rni si od modelu programistycznego, do ktrego przyzwyczaili si programici przetwarzajcy dane relacyjne.
Poznajmy najpierw podstawow terminologi XML, a potem zaczniemy poznawa
coraz gbsze tajemnice technologii, aby mc j jak najlepiej zrozumie. Czsto mona usysze ludzi rozprawiajcych o dokumentach, elementach i atrybutach. Najlepiej
jest przyj podejcie, wedug ktrego caa struktura XML-a to dokument, dokument
zawiera elementy, a elementy mog zawiera atrybuty. Poniszy przykadowy dokument XML zawiera jeden dokument, trzy elementy i dwa atrybuty:
<?xml version="1.0"?>
<customer>
<name id="10">Tom Rizzo</name>
<state region="Northwest">WA</state>
</customer>
XML posiada schematy i przestrzenie nazw. Nie istnieje wymg, by nakada schematy na XML, lecz dziki schematom i przestrzeniom nazw mona w unikatowy sposb
definiowa poprawne i niepoprawne struktury danych w dokumencie XML. W wiecie relacyjnym mamy do czynienia ze strukturami tabel oraz ograniczeniami. Niektre
rozwizania relacyjne mona odwzorowywa na schematy XML, poniewa schematy
XML posiadaj typy danych oraz reguy wyznaczajce kolejno, moc i inne aspekty
dokumenty XML. Dziki schematom mona wspuytkowa wasne dane XML z innymi uytkownikami i zapewni, e inni uytkownicy nadal bd rozumie te dane.
Przestrze nazw XML to kolekcja nazw identyfikowana przez odwoanie URI uywane w dokumencie XML przez typy elementw oraz nazwy atrybutw. Dziki przestrzeniom nazw mona uywa tych samych nazw pochodzcych z rnych rde
i unika konfliktw midzy nimi. Na przykad mona uy tego samego elementu
271
o nazwie customer pochodzcego z dwch rnych rde, jeli tylko podana zostanie
przestrze nazw identyfikujca elementy jako nalece do odmiennych przestrzeni
nazw. Schematy i przestrzenie nazw bd szczeglnie wane, gdy bdziemy poznawa
nowy typ danych XML dostpny w SQL Serverze 2005 oraz omawia natywny sposb
przechowywania danych XML w bazie danych.
Drzewo nie jest szczeglnie imponujce, ale bez wtpienia jest to drzewo. Wida w nim
wszystkie elementy, atrybuty i wzy tekstowe. Przy uyciu XPath mona odczytywa
siedem typw wzw: wze gwny, element, atrybut, przestrze nazw, instrukcj
przetwarzania, komentarz i wze tekstowy. W instrukcjach XPath uywa si najczciej elementw, atrybutw, instrukcji przetwarzania oraz wzw tekstowych.
272
XPath wykorzystuje si najczciej do nawigowania wrd rnych wzw za pomoc osi XPath (ang. XPath axis). Osie XPath opisuj sposb nawigacji w strukturze
przez wskazanie punktu pocztkowego oraz kierunku nawigacji. W XPath wystpuje
13 osi, lecz najczciej uywa si osi child (potomkw) i attribute (atrybutw). W tabeli 7.1
opisano wszystkie 13 dostpnych osi.
Tabela 7.1. Osie XPath
Nazwa
Opis
Ancestor
Ancestor-or-self
Attribute
Zawiera atrybuty wza kontekstu, jeli wze kontekstu jest wzem elementu.
Child
Descendant
Descendent-or-self
Following
Following-sibling
Namespace
Zawiera wzy przestrzeni nazw wza kontekstu, o ile wze kontekstu jest
elementem.
Parent
Zawiera wze rodzica wza kontekstu. Wze gwny nie posiada rodzica.
O jest przeciwiestwem osi potomkw.
Preceding
Preceding-sibling
Self
Skadnia XPath
Do wyboru wzw podlegajcych przetwarzaniu XPath uywa zestawu wyrae.
Najczciej spotykanym wyraeniem jest lokalizacja cieki. Wyraenie to zwraca zestaw wzw (ang. node set). XPath pozwala na uywanie skadni penej oraz skadni
skrconej. Pena skadnia lokalizacji cieki ma nastpujc posta:
/nazwaOsi::wzeTest[predykat]/nazwaOsi::wzeTest[predykat]
273
naleaoby uy penej skadni XPath przedstawionej poniej. Jeli adna o nie zostanie wskazana, przyjta zostanie domylna o child.
/child::root/child::customer
Opis
"domylna"
//
..
Symbol uywany jako separator cieek. Uywany rwnie jako cieka bezwzgldna
dla gwnego wza dokumentu.
Aby zwrci wszystkie elementy potomne dla wza customer z poprzedniego przykadu i aby uzyska wycznie wszystkie atrybuty, a take aby odczyta wszystkich
klientw zamieszkujcych w regionie Northwest, naleaoby uy nastpujcej skadni
XPath:
/customer/*
/customer/@*
/customer[@region = "Northwest"]
274
Funkcje XPath
XPath udostpnia funkcje, dziki ktrym mona zwraca wartoci albo manipulowa
danymi XML. XPath posiada funkcje cigw znakw, zestaww wzw, liczbowe
i logiczne. Najczciej uywa si funkcji position(), count(), contains(), substring(),
sum() i round().
t Funkcja position() zwraca wskazan pozycj w dokumencie. Na przykad
instrukcja /customer[position() = 2n zwrci element customer znajdujcy
si na pozycji numer 2. Skadni funkcji mona skrci przez pominicie
fragmentu position() = . Na przykad zapis /customer[2n odpowiada
wczeniejszej instrukcji.
t Funkcja count() zwraca liczb wzw w zestawie wzw. Na przykad jeli
trzeba zliczy wszystkich klientw, mona wykona instrukcj /count(customer).
275
Gdy uywany jest XMLDOM, trzeba najpierw zadeklarowa obiekt typu XMLDocument.
Typ XMLDocument rozszerza typ XMLNode, ktry reprezentuje wze dowolnego typu
w dokumencie XML. Po zadeklarowaniu obiektu XMLDocument trzeba zaadowa lub
utworzy dokument XML. Do zaadowania dokumentu XML mona uy metody
load albo loadxml, jak w poniszym kodzie:
Imports System.Xml.XmlDocument
Dim oXMLDOM As New System.Xml.XmlDocument
oXMLDOM.Load("c:\myxml.xml")
'lub, jeli XML istnieje ju jako cig znakw
'oXMLDOM.LoadXml(strXML)
Gdy dokument zostanie ju zaadowany, mona przemierza jego wzy przy uyciu
obiektu XMLNode oraz waciwoci ChildNodes waciwoci DocumentElement. Waciwo DocumentElement zwraca dokument XML, a waciwo ChildNodes zwraca
kolekcj wzw tworzcych dokument. Poniszy kod przemierza dokument XML
i zwraca znajdujce si w nim wzy:
Dim oXMLNode As System.Xml.XmlNode
Dim strResult As String = ""
For Fach oXMLNode In oXMLDOM.DocumentFlement.ehildNodes
strResult += oXMLNode.Name & ": " & _
oXMLNode.InnerText
Next
MsgBox(strResult)
XMLDOM pozwala rwnie na odczytywanie elementw na podstawie nazwy znacznikw suy do tego funkcja GetElementsByTagName. Na przykad jeli istnieje element o nazwie customer, mona odczyta jego warto nastpujc instrukcj:
MsgBox(oXMLDOM.GetFlementsByTagName("customer").Item(0).InnerText)
Funkcja GetElementsByTagName zwraca list wzw, ktr mona parsowa. Powyszy kod odczytuje jedynie pierwszy wze na licie, lecz w razie potrzeby mona
przej w ptli przez wszystkie wzy i po kolei je zwraca. W XMLDOM dostpne
s rwnie analogiczne funkcje GetElementsByID oraz GetElementsByName.
A w jaki sposb w XMLDOM mona uywa XPath? Ot aby zwrci list wzw
odpowiadajcych instrukcji XPath dla XMLDOM, naley uy metody SelectNodes.
Metoda SelectNodes wymaga podania wyraenia, ktrym moe by instrukcja jzyka
XML Stylesheet Language (XSL) lub wyraenie XPath. Mona take skorzysta z metody SelectSingleNode, aby uzyska tylko jeden wze zamiast caej listy wzw.
Poniszy kod wykonuje przekazane wyraenie i przechodzi przez zwrcone wzy, po
czym wypisuje ich wartoci:
276
Kod widoczny poniej tworzy instancj obiektu XPathDocument i aduje do niego dane
XML. Nastpnie przy uyciu metody CreateNavigator kod tworzy obiekt XPathNavigator. Ta sama metoda jest rwnie obsugiwana przez klas XMLDocument. Aby wykona wyraenie XPath, kod wywouje metod Select i przekazuje do niej wyraenie.
Jak mona zauway, zadaniem wyraenia jest odszukanie klientw o nazwisku
Tom Rizzo i zwrcenie stanw, w ktrych ci klienci zamieszkuj.
'utworzenie instancji klasy XPathDocument
Dim oXPathDoc As New System.Xml.XPath.XPathDocument("c:\note.xml")
'utworzenie instancji klasy XPathNavigator
Dim oXPathNav As System.Xml.XPath.XPathNavigator = oXPathDoc.ereateNavigator()
'utworzenie instancji klasy XPathIterator
Dim oXPathNodesIt As System.Xml.XPath.XPathNodeIterator = & _
oXPathNav.Select("//customer/name[. = 'Tom Rizzo']/parent::node()/state")
'utworzenie instancji cigu znakw do przechowywania wynikw
Dim strResult as string = ""
'klasa XPathIterator posuy do nawigowania po wygenerowanym zestawie wynikw,
'a nastpnie do wywietlenia wybranych firm Parent Companies
Do While oXPathNodesIt.MoveNext
strResult += oXPathNodesIt.eurrent.Value
Loop
Msgbox(strResult)
277
Dane XML mona wstawia do bazy danych rwnie na trzy inne sposoby:
t Dane XML mona rozdrobni i wstawi do poszczeglnych wierszy i kolumn
w SQLXML. Przy uyciu dostawcy mona pobra duy zestaw danych XML
i w szybki sposb zaadowa go do SQL Servera.
Od razu nasuwa si pytanie o to, ktry z przedstawionych sposobw jest najlepszy. Ot
kady z nich ma swoje wady i zalety. Jeli najwaniejsz kwesti jest jak najszybsze
i jak najbardziej wydajne zaadowanie danych XML do SQL Servera, wwczas najlepiej
skorzysta z dostawcy BulkLoad. Dostawca BulkLoad nie prbuje wczyta wszystkich
danych XML do pamici, lecz w zamian wczytuje dane XML w postaci strumienia, dokonuje ich interpretacji i aduje do SQL Servera. Dostawca BulkLoad jest oddzielnym komponentem, zatem jeli zachodzi konieczno uycia mechanizmu adujcego
dane wewntrz procedury skadowanej albo funkcji zdefiniowanej przez uytkownika,
dostawcy BulkLoad nie mona uy. Mona go natomiast uywa w rozszerzonej procedurze skadowanej (XP) poprzez wywoanie, lecz takie rozwizanie jest rzadko stosowane i wi si z nim dodatkowe problemy. Dodatkowe problemy wi si gwnie
ze znacznym stopniem skomplikowania procedur rozszerzonych, trudnoci w ich debugowaniu oraz, w przypadku, gdy procedura rozszerzona okae si nieprawidowo zaimplementowana, grob naruszenia zasad bezpieczestwa serwera.
278
Z kolei OPENXML moe by uywany w procedurach skadowanych i funkcjach zdefiniowanych przez uytkownika, poniewa jest to cz natywnego jzyka T-SQL. Cen
jest jednak nisza wydajno takiego rozwizania. OPENXML wymaga, by do parsowania dokumentw majcych pniej podlega przetwarzaniu uywa procedury skadowanej sp_xml_preparedocument. Procedura skadowana aduje specjaln wersj parsera MSXML o nazwie MSXMLSQL, ktrego zadaniem jest parsowanie dokumentu
XML, a nastpnie cay dokument XML zostaje zaadowany do pamici. Uycie OPENXML
wymaga napisania dodatkowego kodu oraz wie si z wikszym wykorzystaniem
zasobw. Wicej informacji na ten temat zostanie przedstawionych w dalszej czci
rozdziau, w punkcie SQLXML: Widoki XML uywajce adnotowanych schematw XML.
Diagramy aktualizujce przydaj si najbardziej w aplikacjach, w ktrych trzeba
zmodyfikowa baz danych i tworzenie adnotowanych schematw (o ktrych wicej
mwimy w dalszej czci rozdziau) oraz wprowadzanie zmian na podstawie adnotowanych schematw nie budzi oporw. SQLXML pobiera diagramy uaktualniajce
i tumaczy je na instrukcje DML jzyka SQL. Gwnym ograniczeniem diagramw
aktualizujcych jest to, e jeli w instrukcjach SQL DML trzeba zastosowa logik
biznesow, wwczas uycie diagramw staje si niemoliwe, poniewa nie mona
uzyskiwa dostpu do wygenerowanych instrukcji DML.
Zanim przejdziemy dalej i zaczniemy poznawa sposoby wykorzystania przedstawionych technologii, musimy najpierw odpowiednio skonfigurowa SQL Server.
279
OPENXML
Zamiast wasnorcznie parsowa XML do postaci wierszy poprzez adowanie i parsowanie danych XML, a nastpnie iterowanie przez te dane i generowanie odpowiednich polece T-SQL, mona uy funkcji OPENXML. Skadnia OPENXML moe na pocztku wyda si skomplikowana, lecz gdy si j wyprbuje na praktycznym przykadzie,
okae si, e jest ona cakiem zrozumiaa:
OPFNXML(uchwyt int [in],wzorzecwiersza nvarchar[in],[znaczniki byte[in]])
[WIT (DeklaracjaSchematu | NazwaTabeli)]
280
281
Opis
@mp:id
@mp:localname
@mp:namespaceuri
@mp:pre@ix
@mp:prev
@mp:xmltext
@mp:parentid
@mp:parentlocalname
@mp:parentnamespaceuri
@mp:parentpre@ix
Przyjrzyjmy si teraz kilku przykadowym sposobom uycia funkcji OPENXML. Wykorzystamy poniszy prosty dokument XML:
<ROOT>
<authors>
<au_id>172-32-1176</au_id>
<au_lname>White</au_lname>
<au_@name>Johnson</au_@name>
282
Niektrzy czytelnicy zauwayli ju pewnie w kodzie XML sztuczk, jak si posuylimy. Generowanie przykadowych danych XML to adna frajda, dlatego uylimy
funkcji FOR XML, ktr pniej opiszemy, na tabeli authors w bazie danych pubs.
Jedyna dokonana zmiana wynika z faktu, e wolimy posugiwa si elementami
zamiast atrybutami, dlatego FOR XML zostaa skonfigurowana w taki sposb, by zwrcia dane w formacie bazujcym na elementach.
283
</ROOT>'
--utworzenie wewntrznej reprezentacji dokumentu XML
FXFe sp_xml_preparedocument @idoc OUTPUT, @doc
--wykonanie instrukcji SELECT, ktra uywa dostawcy zestawu wierszy OPENXML
INSFRT AuthorsXML (title, au_id)
SFLFeT title, au_id
FROM OPFNXML (@idoc, '/ROOT/authors',2)
WIT (au_id varchar(11),
au_lname varchar(40),
au_@name varchar(20),
title varchar(20),
phone char(12)
)
FXFe sp_xml_removedocument @idoc
au_lname
-------------------White
Green
au_@name
------------------------Johnson
Marjorie
phone
-------------408 496-7223
415 986-7020
Teraz jednak wida, e niektre dane XML nie zostan zapisane, na przykad adres,
miasto, stan, kod pocztowy i kontrakt. Jeli konieczne bdzie zapisanie wszystkich
danych, mona odczyta cay dokument XML, tworzc dodatkow kolumn i w definicji schematu wykorzystujc polecenie @mp:xmltext w nastpujcy sposb:
catchall nvarchar(1000) '@mp:xmltext'
Ostatni przykad uycia funkcji OPENXML pokazuje, w jaki sposb mona pobra wynik
dziaania funkcji OPENXML i zapisa go w tabeli. T sam czynno wykonano w poprzednim przykadzie, lecz tym razem pokaemy dodatkowo, jak w OPENXML mona
nawigowa po dokumencie XML, korzystajc z wyraenia XPath. Poniewa OPENXML
zwraca relacyjny zestaw wierszy, mona uzyskany wynik poczy z inn tabel,
a nastpnie zapisa wynik we wasnej tabeli. Po wywoaniu tabeli dane XML mona
traktowa jak kade inne dane o charakterze relacyjnym. W naszym przykadzie uyjemy
wynikowego zestawu wierszy XML do poczenia danych z zawartoci tabeli wydawcw, aby zwrci tylko tych autorw, ktrzy mieszkaj w tym samym miecie co
wydawca.
DFeLARF @idoc int
DFeLARF @doc varchar(1000)
SFT @doc ='
<ROOT>
<authors><au_id>172-32-1176</au_id><au_lname>White</au_lname>
<au_@name>Johnson</au_@name>
<phone>408 496-7223</phone><address>10932 Bigge Rd.</address>
284
285
286
Visual Studio zawiera bardzo porczny edytor schematw XML, dziki ktremu uytkownik nie musi generowa schematw rcznie. Poniej znajduje si standardowy
schemat XML dla danych XML authors, ktrych uywalimy w poprzednich punktach. Jak wida, schemat XML jest dokumentem XML. System rozpoznaje, e dany
dokument jest schematem dziki temu, e zadeklarowano w nim przestrze nazw xs,
ktra uywa przestrzeni nazw XSD. Przestrze nazw XSD stanowi odwoanie do
przestrzeni nazw W3C XSD, ktr jest http://www.w3c.org/2001/XMLSchema. Odwoaniu przypisywany jest alias xs, a wszystkie elementy uywaj aliasu w schemacie jako
prefiksu.
Warto rwnie zwrci uwag na sposb, w jaki w schemacie zadeklarowano element
o nazwie CuthorsXMLNew, ktry zawiera pozosta cz danych XML. Nastpnie
w schemacie wystpuje typ complexType, ktry stanowi deklaracj sekwencji ele-
287
mentw XML. Wrd elementw wystpuj ID, imi, nazwisko, numer telefonu oraz
inne informacje dotyczce autorw. Wany jest sposb, w jaki w elementach deklaruje si typ. Schematy mog definiowa typy danych dla elementw i atrybutw,
zatem w naszym schemacie deklarowane s cigi znakw, nieoznaczona liczba cakowita oraz nieoznaczony bajt. Schemat moe zawiera rwnie deklaracje innych
typw, takich jak daty, Boolean, dane binarne i inne.
<?xml version="1.0" encoding="ut@-8"?>
<xs:schema attributeFormDe@ault="unquali@ied"
elementFormDe@ault="quali@ied"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="AuthorsXMLNew">
<xs:complexType>
<xs:sequence>
<xs:element name="au_id" type="xs:string" />
<xs:element name="au_lname" type="xs:string" />
<xs:element name="au_@name" type="xs:string" />
<xs:element name="phone" type="xs:string" />
<xs:element name="address" type="xs:string" />
<xs:element name="city" type="xs:string" />
<xs:element name="state" type="xs:string" />
<xs:element name="zip" type="xs:unsignedInt" />
<xs:element name="contract" type="xs:unsignedByte" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Gdy istnieje ju schemat bazowy i trzeba utworzy na jego podstawie schemat adnotowany, ktry bdzie uywany z SQLXML, naley wprowadzi odpowiednie zmiany.
Najpierw trzeba doda odwoanie do odwzorowania schematu XML. W tym celu naley zmodyfikowa schemat XML, dodajc do niego przestrze nazw dla odwzorowania schematu SQL Servera, ktr jest urn:schemas-microsoft-com:mapping-schema.
Dziki temu schematowi posiadany schemat XML mona odwzorowywa na schemat
relacyjnej bazy danych. Przestrzeni nazw nadamy alias sql, aby w odwoaniach do
niej mc uywa symbolu sql:. Zatem aby zmodyfikowa poprzedni schemat w taki
sposb, by obsugiwa on odwzorowanie SQL Servera, naleaoby uy nowego
schematu w nastpujcej postaci:
<?xml version="1.0" encoding="ut@-8" ?>
<xs:schema id="XMLSchema1" targetNamespace="http://tempuri.org/XMLSchema1.xsd"
elementFormDe@ault="quali@ied"
xmlns="http://tempuri.org/XMLSchema1.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
. . .
W rnych dokumentach czsto wystpuje rwnie przestrze nazw urn:schemasmicrosoft-com:xml-sql. Przestrze ta daje dostp do funkcji SQLXML, ktrej mona
uywa w szablonach lub zapytaniach XPath.
288
Odwzorowanie domylne
Nietrudno si zorientowa, e w poprzednim schemacie dodano po prostu przestrze
nazw dla celw odwzorowywania. Schemat nie zosta wskazany, poniewa SQL Server
obsuguje domylne odwzorowanie midzy schematem relacyjnym oraz schematem
XML. Na przykad typ zoony authors zostaby automatycznie odwzorowany na tabel
authors, cig znakw au_id zostaby automatycznie odwzorowany na kolumn au_id
i tak dalej.
Odwzorowanie jawne
Odwzorowania midzy schematem i typami danych SQL mona take definiowa
w sposb jawny. Odwzorowa domylnych mona uywa w bardzo prostych aplikacjach, natomiast w wikszoci przypadkw uywa si odwzorowania jawnego. Przyczyn s zwykle rnice midzy schematami XML i relacyjnym albo ch utrzymania
wikszej kontroli nad sposobem wykonywania odwzorowa oraz uycia typw danych. Odwzorowanie midzy jednostk XML a tabel SQL definiuje si przy uyciu
znacznika sql:relation, ktry naley do schematu odwzorowania SQLXML. Dla kolumn uywa si znacznika sql:field. Dostpny jest rwnie znacznik sql:datatype,
dziki ktremu mona jawnie odwzorowywa typy danych XML na typy danych SQL
i zapobiega wykonywaniu konwersji niejawnej. Jeli wic zrezygnujemy z domylnego
odwzorowywania dla naszego schematu i dodamy wspomniane znaczniki, schemat
w nowej postaci wygldaby nastpujco:
<?xml version="1.0" encoding="ut@-8"?>
<xs:schema attributeFormDe@ault="unquali@ied" elementFormDe@ault="quali@ied"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microso@tcom:mapping-schema">
<xs:element name="AuthorsXMLNew" sql:relation="AuthorsXMLNew">
<xs:complexType>
<xs:sequence>
<xs:element name="au_id" type="xs:string" sql:@ield="au_id" />
<xs:element name="au_lname" type="xs:string" sql:@ield="au_lname" />
<xs:element name="au_@name" type="xs:string" sql:@ield="au_@name" />
<xs:element name="phone" type="xs:string" sql:@ield="phone" />
<xs:element name="address" type="xs:string" sql:@ield="address" />
<xs:element name="city" type="xs:string" sql:@ield="city" />
<xs:element name="state" type="xs:string" sql:@ield="state" />
<xs:element name="zip" type="xs:unsignedInt" sql:@ield="zip" />
<xs:element name="contract" type="xs:unsignedByte" sql:@ield="contract"
sql:datatype="bit" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Relacje
W relacyjnych bazach danych mona tworzy relacje midzy danymi na podstawie
kluczy, natomiast w celu opisania zdefiniowanych relacji w XML-u naley uy schematw adnotowanych.
289
290
. . .
sql:@ield="au_lname"></xs:element>
<xs:element name="au_@name" type="xs:string"
sql:@ield="au_@name"></xs:element>
291
292
Opis
sql:encode
Wskazuje, czy naley zwraca adres URL lub dane binarne typu BLOB.
Warto URL powoduje zwrcenie adresu URL, natomiast warto de@ault
oznacza, e naley zwrci dane w bazowym formacie z kodowaniem base-64.
sql:identity
sql:max-depth
sql:over@low-@ield
sql:use-cdata
znajdujce si w SQL Serverze, uywajc do tego celu formatu XML. Zamiast pisa
odpowiedni kod T-SQL, zmiany w danych przedstawia si w postaci obrazw sytuacji
sprzed zmiany i po niej majcych format XML. Diagramy uaktualniajce mona wykonywa z poziomu ADO lub ADO.NET, o czym przekonamy si dziki kompletnemu
przykadowi zamieszczonemu na kocu rozdziau.
Pierwszym krokiem pozwalajcym zrozumie dziaanie diagramw uaktualniajcych
XML jest poznanie uywanej przez diagramy przestrzeni nazw urn:schemas-microsoftcom:xml-updategram. W deklaracji przestrzeni nazw przestrze nazw diagramw uaktualniajcych jest zazwyczaj skracana do postaci updg.
Kady diagram uaktualniajcy musi mie co najmniej jeden element sync, ktry jest
elementem XML i zawiera dane majce podlega zmianie zdefiniowane przy uyciu
elementw before i after. Liczba elementw sync moe by wiksza ni jeden. Kady element sync odpowiada jednej transakcji, co oznacza, e wszystkie zmiany wynikajce z definicji elementu s zatwierdzane albo zostaj w caoci wycofane. Element
before zawiera dane w postaci sprzed zmiany. Zwykle konieczne jest wskazanie klucza,
na podstawie ktrego SQL Server bdzie mg odnale dane majce ulec zmianie.
Element before moe zmienia wycznie jeden wiersz tabeli.
Element after zawiera zmienione dane. Nietrudno si domyli, e wstawienie danych
bdzie wymagao zdefiniowania odpowiedniej wartoci elementu after, natomiast
element before nie bdzie posiada adnej wartoci. Z kolei dla usunicia danych
trzeba wskaza warto elementu before, a after bdzie pusty. Dla operacji uaktualniania danych konieczne jest zdefiniowanie wartoci zarwno dla elementu before,
jak i after. Poniej znajduje si diagram uaktualniajcy w najprostszej postaci:
293
<ROOT xmlns:updg="urn:schemas-microso@t-com:xml-updategram">
<updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >
<updg:be@ore>
...
</updg:be@ore>
<updg:a@ter>
...
</updg:a@ter>
</updg:sync>
</ROOT>
Opcjonalnie mona wskaza plik z adnotowanym schematem, ktry jawnie odwzoruje elementy z diagramu uaktualniajcego na kolumny w tabelach. Jeli plik z adnotowanym schematem nie zostanie wskazany, SQL Server uyje odwzorowania domylnego, o czym wspomniano ju w poprzednim punkcie dotyczcym odwzorowywania
schematw adnotowanych. Naley rwnie zaznaczy, e moliwe jest jednoczesne
uywanie odwzorowa bazujcych na elementach oraz odwzorowa bazujcych na
atrybutach. Jednak ze wzgldu na czytelno schematu zaleca si, by zawsze korzysta
tylko z jednego rodzaju odwzorowania.
Aby w diagramie uaktualniajcym wskaza warto pust, naley zastosowa atrybut
nullvalue elementu sync, ktry zdefiniuje symbol zastpczy dla wartoci null. Na
przykad jeli wartoci null ma odpowiada warto nothing, mona by uy poniszego diagramu uaktualniajcego, ktrego skadnia bazuje na atrybutach:
<?xml version="1.0"?>
<authorsupdate xmlns:updg=
"urn:schemas-microso@t-com:xml-updategram">
<updg:sync updg:nullvalue="nothing">
<updg:be@ore>
<Authors au_id="172-32-1176"/>
</updg:be@ore>
<updg:a@ter>
<Authors state="nothing" phone="nothing"/>
</updg:a@ter>
</updg:sync>
</authorsupdate>
294
295
SQLXML. Ten z kolei wywouje funkcje zbiorczego adowania danych SQL Servera,
ktre wykonaj adowanie ze rda danych XML do serwera. Przed uruchomieniem
zbiorczego adowania danych XML warto jest uruchomi ledzenie. W ten sposb
bdzie mona sprawdzi, jakie dokadnie polecenia wykonuje Bulkload, a take naprawi ewentualne bdy powstae w trakcie adowania oraz uzupeni brakujce dane.
Bulkload rozszerza zakres moliwoci schematw odwzorowujcych, o ktrych mwilimy we wczeniejszych punktach rozdziau. Schemat odwzorowujcy wskazuje
komponentowi Bulkload miejsca w bazie danych, do ktrych powinny trafi adowane dane XML. Model obiektowy Bulkload jest bardzo prosty. Zawiera on jedn metod o nazwie Execute oraz szereg waciwoci, ktre su do konfigurowania sposobu
wykonywania zbiorczego adowania danych. Metoda Execute przyjmuje dwa parametry. Pierwszym z nich jest cieka do pliku ze schematem odwzorowywania. Drugi
parametr jest opcjonalny i wskazuje ciek lub strumie pliku XML, ktry ma zosta
zaimportowany.
Opis
Bulkload
eheckeonstraints
eonnectioneommand
eonnectionString
FrrorLogFile
FireTriggers
ForceTableLock
IgnoreDuplicateKeys
296
Opis
KeepIdentity
KeepNulls
SchemaGen
SGDropTables
SGUseID
TempFilePath
Transaction
XML Fragment
297
Jeli w tabeli zdefiniowano ograniczenia i trzeba ich przestrzega w trakcie zbiorczego adowania danych przez Bulkload, wwczas waciwoci CheckConstraints naley
przypisa warto true. Domylnie Bulkload wycza sprawdzanie ogranicze, zyskujc w ten sposb na wydajnoci. Bez wzgldu na to, czy ograniczenia bd sprawdzane czy te nie, najpierw w schemacie odwzorowujcym powinno si umieszcza
klucze gwne, a dopiero potem klucze obce.
Jeli klucze obce maj by ignorowane, logicznej waciwoci IgnoreDuplicatezeys
naley przypisa warto true. Jest to rozwizanie przydatne w sytuacjach, gdy osoba
generujca dane nie wie, jakie dane ju znajduj si w tabeli docelowej i chcemy
unikn sytuacji, gdy Bulkload koczy si niepowodzeniem z powodu wystpienia
zduplikowanych kluczy. Bulkload nie zatwierdzi wiersza ze zduplikowanym kluczem,
lecz od razu przejdzie do przetwarzania nastpnego wiersza.
Wielu projektantw baz danych wykorzystuje kolumny identyfikatorw, aby zagwarantowa unikatowo kluczy w tabeli. Czasami adowany dokument XML posiada
ju element mogcy spenia rol identyfikatora, ktry trzeba zastosowa, zamiast
wykorzystywa SQL Server do generowania wartoci przy uyciu wasnego algorytmu serwera. W tym celu waciwoci zeepIdentity naley przypisa warto true,
ktra jest domyln wartoci waciwoci. Naley przy tym pamita, e jest to
warto globalna, dlatego nie mona zmusi SQL Servera do generowania w niektrych
przypadkach wasnego identyfikatora, a w pozostaych przypadkach uywa identyfikatorw zawartych w danych XML.
Waciwo zeepNulls obiektu Bulkload domylnie ma warto false. Oznacza to, e
Bulkload nie wstawi automatycznie wartoci null w kolumnach, dla ktrych w dokumencie XML zabrako odpowiadajcego atrybutu lub elementu. Jeli waciwoci
zostanie przypisana warto true, naley zachowa szczegln ostrono, poniewa
Bulkload zakoczy swe dziaanie niepowodzeniem w przypadku, gdy wystpowanie
wartoci null w kolumnie bdzie zabronione. W sytuacji, gdy waciwo bdzie mie
warto true i dla kolumny zdefiniowana bdzie warto domylna, Bulkload i tak nie
wstawi w kolumnie wartoci domylnej.
Kolejn interesujc waciwoci Bulkload jest waciwo ForceTableLock, ktra
powoduje zablokowanie tabeli na czas zbiorczego adowania danych. Dziki blokadzie mona zwikszy wydajno operacji adowania, lecz w zamian inni uytkownicy nie bd mieli dostpu do tabeli. Domyln wartoci waciwoci jest false,
co oznacza, e Bulkload zakada blokad na tabel przy kadej operacji wstawiania
wiersza.
Jeeli tabele docelowe jeszcze nie istniej, Bulkload moe odpowiednie tabele utworzy. W tym celu waciwoci SchemaGen naley przypisa warto true. Bulkload odczyta typy danych ze schematu odwzorowujcego i na ich podstawie automatycznie
wygeneruje prawidowy schemat bazy danych. Jeli ju istnieje tabela lub kolumna
o takiej samej nazwie i naley j usun i utworzy na nowo, wwczas waciwoci
SGDropTables naley przypisa warto true.
298
299
Tryb RAW
W trybie RCW klauzula FOR XML zwraca kolumny jako atrybuty i wiersze jako elementy row.
Poniej znajduje si przykad zastosowania klauzuli FOR XML RCW:
USF pubs
GO
SFLFeT * FROM Authors FOR XML RAW
Jak wida, kademu wierszowi odpowiada jeden element wiersza row, a dla kadej
niepustej kolumny tworzony jest atrybut elementu wiersza. Jeli odczytywane s dane
binarne, trzeba dopisa klauzul BINCRY BCSE64. Z kolei aby wraz z danymi XML
uzyska take schemat XML-Data, naley uy klauzuli XMLDCTC.
Tryb AUTO
W trybie CUTO klauzula FOR XML dziaa podobnie jak w trybie RCW, to znaczy kady
wiersz jest zwracany w postaci elementu, a wartoci w kolumnach s zwracane jako
atrybuty. Jedyna rnica wie si z nazw elementu reprezentujcego wiersz, ktr
w trybie CUTO jest nazwa tabeli. Spjrzmy zatem na wynik poniszego zapytania:
USF pubs
GO
SFLFeT * FROM Authors FOR XML AUTO
300
Nazwa tabeli wyznacza element dla kadego wza, a wartoci kolumn s atrybutami
danego elementu. Zagniedanie elementw jest uzalenione od kolejnoci w klauzuli
SELECT, dlatego kolejnoci pl naley powici szczegln uwag. Ponadto w zapytaniu SELECT z klauzul FOR XML nie mona uywa klauzuli GROUP BY, mona natomiast wykonywa sortowanie przy uyciu klauzuli ORDER BY. Zamiast GROUP BY mona
uywa zagniedonych zapyta SELECT i uzyska podobne wyniki, lecz takie rozwizanie zmniejsza nieco wydajno dziaania. W przypadku wykonywania zcze tryb
CUTO odpowiednio zagniedzi zestaw wynikw, co w wikszoci przypadkw bdzie
dziaaniem podanym. Jeli natomiast wyniki nie maj by zagniedane, trzeba
skorzysta z trybu EXPLICIT i samemu nada format danych XML. Na przykad jeli
trzeba wykona zczenie danych z tabel Publishers oraz Titles i w danych XML
wszystkie tytuy powinny by zagniedane pod odpowiadajcymi im wydawcami,
naleaoby wykona nastpujcy kod:
USF pubs
GO
SFLFeT Publishers.Pub_Name, Titles.Title, Titles.Price
FROM Titles, Publishers W FRF Publishers.Pub_ID = Titles.Pub_ID
FOR XML AUTO
Wraz z klauzul FOR XML CUTO mona take uywa opcji ELEMENTS. Uytkownicy preferujcy uywanie elementw zamiast atrybutw mog w ten sposb uy trybu CUTO
i uzyska wyniki w postaci bazujcej na elementach, a nie atrybutach. Osobicie wolimy stosowa skadni bazujc na elementach, ktra zwiksza wprawdzie rozmiar
danych XML przede wszystkim przez obecno znacznikw otwierajcych i zamykajcych, jednak wynikowe dane XML s wwczas bardziej czytelne i zrozumiae.
Tryb EXPLICIT
Ostatnim trybem jest EXPLICIT. Jak wskazuje nazwa trybu, umoliwia on sprawowanie
penej kontroli nad sposobem generowania danych XML. Uytkownik musi opisa
sposb, w jaki ma zosta ustrukturyzowany wynikowy dokument XML, a SQL Server
wypeni tak opisany dokument odpowiednimi informacjami. Aby opisa dokument XML,
trzeba uy tabeli uniwersalnej. Tabela uniwersalna zawiera po jednej kolumnie
301
tabeli dla kadej wartoci, ktra ma by zwracana, oraz dwa dodatkowe znaczniki, z ktrych jeden unikatowo identyfikuje znaczniki w danych XML, a drugi identyfikuje relacje
rodzic-potomek. Pozostae kolumny opisuj dane. Tabela 7.6 ilustruje uniwersaln tabel
dla trybu EXPLICIT.
Tabela 7.6. Tabela uniwersalna
Znacznik
Rodzic
Dyrektywa kolumny 1
Dyrektywa kolumny 2
Null
Dana
Dana
Dana
Dana
Dana
Dana
Pierwsz rzecz, ktra si rzuca w oczy, jest obecno kolumn Tag i Parent na licie
kolumn. Kolumny Tag i Parent s wymagane do zidentyfikowania znacznika biecego
elementu, ktrym jest liczba cakowita z przedziau od 1 do 255, oraz rodzica biecego
elementu. W naszym przykadzie dane nie s zagniedane, rodzic ma zawsze warto
null, a znacznikiem jest zawsze warto 1, poniewa zawsze odwoujemy si do tego
samego rodzica. Dalej wida, e uywana jest klauzula CS, ktra zmienia nazw danych tak, aby opisa podane formatowanie XML. Nazwa nadawana kolumnie au_id
wskazuje SQL Serverowi, e naley uy elementu Cuthors, identyfikatora znacznika
1 oraz nazwy atrybutu. Pozostae dane powinny mie charakter elementw, zatem jako ich nazwa wskazywany jest jedynie element oraz nazwa znacznika. Na kocu
wskazywana jest klauzula FOR XML EXPLICIT, poniewa nie chcemy uzyskiwa w wyniku
tabeli uniwersalnej opisujcej struktur XML, lecz sam przetworzon struktur XML.
Zapytanie zwrci wyniki w nastpujcej postaci:
<Authors
<Authors
<Authors
<Authors
<Authors
<Authors
. . .
au_id="409-56-7008">Bennet</Authors>
au_id="648-92-1872">Blotchet- alls</Authors>
au_id="238-95-7766">earson</Authors>
au_id="722-51-5454">DeFrance</Authors>
au_id="712-45-1867">del eastillo</Authors>
au_id="427-17-2319">Dull</Authors>
302
Jak wida, nazwisko autora jest zwracane jako warto elementu. Mona sprawi, by
nazwisko byo elementem zagniedanym pod elementem Cuthors. W tym celu zapytanie naley nieco zmodyfikowa, aby uywa dyrektywy elementu w sposb pokazany
poniej:
SFLFeT 1 as Tag, NULL as Parent, au_id as [Authors!1!au_id],
au_lname as [Authors!1!au_lname!element]
FROM Authors FOR XML FXPLIeIT
W tabeli 7.7 przedstawiono wszystkie dostpne dyrektywy oraz opis kadej z nich.
Tabela 7.7. Dyrektywy FOR XML EXPLICIT
Nazwa
Opis
cdata
element
elementxsinil
ID
IDRFF
IDRFFS
hide
xml
Dziaa tak samo jak dyrektywa element, lecz nie wykonuje kodowania.
xmltext
Zajmijmy si teraz przykadem nieco bardziej skomplikowanym. Aby zwrci wszystkich autorw wraz z tytuami ich ksiek oraz wysokoci honorariw, naleaoby
najpierw wykona zapytanie UNION CLL i poczy ze sob odpowiednie dane z poszczeglnych tabel, a nastpnie trzeba by byo zagniedzi wyniki tak, by wynikowa
hierarchia XML odpowiednio odzwierciedlaa autorw, honoraria i tytuy. Zanim jednak napiszemy odpowiednie zapytanie i uzyskamy wyniki, warto przytoczy kilka
wskazwek oraz opisa sposoby eliminowania bdw z zapyta FOR XML EXPLICIT.
Przede wszystkim wielu uytkownikw uzyskuje bd, wedug ktrego nie otwarto
jeszcze znacznika rodzica. Aby zidentyfikowa bd w zapytaniach FOR XML EXPLICIT,
najprociej jest usun t klauzul z zapytania i sprawdzi posta uzyskiwanych wynikw. W efekcie zwrcona zostanie uniwersalna tabela, w ktrej mona poszuka
bdw. Najprostszym sposobem rozwizania bdu zwizanego z brakiem otwartego
znacznika rodzica jest zamieszczenie kolumny znacznika w klauzuli ORDER BY. Dziki
temu zyskamy pewno, e aden znacznik nie zostanie przetworzony przed znacznikiem go poprzedzajcym, co jest przyczyn wystpowania problemu.
303
Parent
NULL
1
2
NULL
1
2
NULL
1
2
1
2
Authors!1!au_@name!element
Abraham
Abraham
Abraham
Akiko
Akiko
Akiko
Albert
Albert
Albert
Albert
Albert
Authors !1 !au_lnameelement
Bennet
Bennet
Bennet
Yokomoto
Yokomoto
Yokomoto
Ringer
Ringer
Ringer
Ringer
Ringer
304
Ju na pierwszy rzut oka wida, e FOR XML EXPLICIT daje znacznie wiksze moliwoci, ale klauzula ta jest zdecydowanie bardziej skomplikowana w uyciu. Jeli wystarczy uycie klauzuli FOR XML CUTO lub RCW i stosowanie trybu FOR XML EXPLICIT, wwczas
napisanie odpowiedniego zapytania bdzie znacznie atwiejsze. Jednak w sytuacjach,
gdy si okae, e FOR XML CUTO i RCW nie speniaj oczekiwa, zawsze mona posuy
si klauzul FOR XML EXPLICIT.
Uywanie szablonw
W trakcie wykonywania zapyta na SQL Serverze z wykorzystaniem SQLXML mona
uywa szablonw. Szablony grupuj technologie, ktre zostay opisane ju wczeniej w tym rozdziale. W szablonach mona uywa zapyta SQL i XPath oraz trzeba
uywa adnotowanych schematw, ktre utworzono dla widoku XML. Schemat moe
by wpisywany bezporednio bd adowany z pliku. Aby zdefiniowa szablon, trzeba
utworzy plik uywajcy przestrzeni nazw urn:schemas-microsoft-com:xml-sql. Po
wskazaniu przestrzeni nazw do szablonu mona przekazywa zapytania SQL i XPath.
SQLXML bdzie przechowywa szablony w pamici podrcznej, aby zwikszy wydajno. Poniszy szablon wykonuje zapytanie SQL:
<Root><sql:query xmlns:sql=""urn:schemas-microso@t-com:xml-sql"">
SFLFeT * FROM Authors FOR XML AUTO</sql:query></Root>
305
<Root><sql:xpath-query xmlns:sql=""urn:schemas-microso@t-com:xml-sql"">/Authors
</sql:xpath-query></Root>
Nowy tryb PCTH pozwala na wskazywanie przy uyciu XPath miejsca w hierarchii
XML, w ktrym powinno si umieci warto kolumny. W ten sposb mona zrezygnowa z uywania skomplikowanej i rozwlekej klauzuli FOR XML EXPLICIT i zamiast
niej generowa bardziej zoone dane XML, korzystajc z zagniedonych instrukcji
FOR XML i nowego trybu PCTH. Poniej znajduje si przykad uycia nowego trybu PCTH.
Przykadowy kod zmienia nazw gwnego elementu na CuthorsNew, a take tworzy
nowy typ zoony o nazwie Names, ktry przechowuje imi i nazwisko.
SFLFeT au_@name "Names/FirstName", au_lname "Names/LastName"
FROM authors FOR XML PAT ('AuthorsNew')
306
307
Podzesp zarzdzany przez SQLXML posiada cztery klasy: SqlXmlCommand, SqlXmlParameter, SqlXmlCdapter oraz SqlXmlException. Dziki wymienionym klasom mona wysya polecenia do SQL Servera i przetwarza wyniki po stronie klienta, czyli
na przykad przetwarza instrukcje FOR XML albo wykonywa szablony XML. W kolejnych punktach opiszemy szczegowo kad z klas, ich metody i waciwoci.
Przedstawione zostan rwnie sposoby programowania SQLXML.
SqlXmlCommand
SqlXmlCommand to jedna z najwaniejszych klas, ktra bdzie najczciej uywana
Opis
elearParameters
ereateParameter
FxecuteNonQuery
FxecuteToStream
FxecuteStream
FxecuteXMLReader
SqlXmlParameter
Klasa SqlXmlParameter pozwala na przekazywanie do kodu parametrw. Klasa ma
bardzo prost konstrukcj, poniewa posiada jedynie dwie waciwoci: Name oraz Value.
Uytkownik wskazuje nazw Name parametru, na przykad customerid, oraz warto
Value, ktr naley przypisa parametrowi. Obiekt SqlXmlParameter tworzy si przez
wywoanie metody CreateParameter obiektu SqlXmlCommand.
SqlXmlAdapter
Obiekt SqlXmlCdapter zapewnia komunikacj midzy zestawami danych .NET oraz
funkcjami SQLXML. Konstruktor obiektu wystpuje w trzech postaciach. W pierwszej postaci konstruktor pobiera obiekt SqlXmlCommand, ktry jest wypeniony odpowiednimi informacjami pozwalajcymi na nawizanie poczenia ze rdem danych.
W drugiej postaci pobierane jest polecenie majce posta tekstow, typ polecenia
w postaci obiektu SqlXmlCommand oraz cig znakw bdcy cigiem poczenia. Ostatnia
posta konstruktora jest bardzo podobna do postaci drugiej jedynie zamiast cigu
znakw z tekstem polecenia pobierany jest obiekt Stream.
308
Opis
BasePath
elientSideXML
eommandStream
eommandText
eommandType
Namespaces
OutputFncoding
RootTag
SchemaPath
Wskazuje ciek dostpu oraz nazw pliku schematu. Jeeli uywane s cieki
wzgldne bazujce na wartoci waciwoci BasePath, wwczas SQLXML bdzie
szuka pliku w katalogu BasePath. Mona take wskazywa cieki bezwzgldne
w postaci c:\mojaaplikacja\mjschemat.xml.
XslPath
Dziaa tak samo jak waciwo SchemaPath, lecz zamiast cieki do pliku
schematu wskazuje ciek dostpu do pliku transformacji XSL.
Utworzony obiekt posiada tylko dwie metody. Pierwsz z nich jest metoda Fill, do
ktrej przekazuje si zestaw danych ADO.NET. SQLXML wypeni przekazany zestaw
danych danymi zwrconymi przez polecenie. Tak utworzony zestaw danych mona
nastpnie modyfikowa przy uyciu standardowych funkcji obsugi zestaww danych
oraz wywoywa drug metod obiektu o nazwie Update. Parametrem metody Update
jest zestaw danych. W trakcie uaktualniania danych w tabeli SQLXML wykonuje blokowanie optymistyczne.
SqlXmlException
Obiekt SqlXmlException dziedziczy po standardowym obiekcie SystemException
i umoliwia zwracanie wyjtkw SQLXML jako czci kodu. Obiekt posiada waciwo ErrorStream, ktrej uywa si do zwracania bdw. Poniszy kod wykorzystuje waciwo ErrorStream do wywietlenia wszystkich bdw przechwyconych
w ramach wyjtku:
309
. . .
eatch ex As Microso@t.Data.SqlXml.SqlXmlFxception
ex.FrrorStream.Position = 0
Dim oSR As New System.IO.StreamReader(ex.FrrorStream)
Dim strResult As String = oSR.ReadToFnd()
System.eonsole.WriteLine(strResult)
Fnd Try
Przykadowe kody
Aby zilustrowa sposb wykorzystania funkcji udostpnianych przez SQLXML, utworzymy przykadow aplikacj. Nasza aplikacja bdzie wykonywa zbiorcze adowanie
danych XML do bazy danych SQL, a nastpnie wykonywa na danych poszczeglne
funkcje opisywane w tym rozdziale, takie jak klauzula FOR XML, integracja zestaww
danych, uruchamianie szablonw, uywanie diagramw uaktualniajcych, a take
wykonywanie przetwarzania po stronie klienta oraz uywanie obiektw XMLTextReader.
Interfejs uytkownika naszej przykadowej aplikacji widnieje na rysunku 7.3.
310
Aplikacja posiada ju odwoanie do SQLXML, zatem nie trzeba ponownie wykonywa tego kroku. Aby rozpocz przetwarzanie danych, naley najpierw zaadowa
dane XML do bazy danych i rozdrobni je w poszczeglnych kolumnach relacyjnych.
W kodzie mona by uy OPENXML, lecz zamiast tego zdecydowalimy si zastosowa
Bulkload XML. Aby mc skorzysta z obiektu Bulkload, naley najpierw doda
w Visual Studio odwoanie do obiektu COM Bulkload. Odpowiedni komponent nosi
nazw Microsoft SQLXML Bulkload 4.0 Type Library. Nastpnie w aplikacji trzeba
utworzy obiekt Bulkload. Ponisze polecenie wykona odpowiedni operacj:
Dim oXMLBulkLoad As New SQLXMLBULKLOADLib.SQLXMLBulkLoad4elass()
311
Nastpnie jako typ polecenia trzeba wskaza typ odpowiedni dla przekazywanego
zapytania. Dla standardowych zapyta SQL typem polecenia jest Sql, jak w poniszym kodzie:
oSQLXMLeommand.eommandType = Microso@t.Data.SqlXml.SqlXmleommandType.Sql
Aby wysa zapytanie FOR XML do serwera, w obiekcie SqlXmlCommand trzeba zdefiniowa tre polecenia. Zapytanie jest przekazywane do metody, dlatego uyjemy do
tego celu zmiennej strSuery:
'przypisanie zapytania
oSQLXMLeommand.eommandText = strQuery
Zapytanie FOR XML mona przetwarza na serwerze albo na kliencie, zatem waciwoci ClientSideXml obiektu polecenia trzeba przypisa warto true lub false. Warto
true bdzie oznacza, e przetwarzanie ma zosta wykonane na kliencie. Po zdefiniowaniu wartoci waciwoci mona ju wykona zapytanie i przeanalizowa wyniki.
Poniszy kod uywa obiektu StreamReader do odczytania wynikw i wstawienia ich
do pola tekstowego dla danych wynikowych. Do tego samego celu mona uy take
obiektu XMLTextReader, ktry przedstawimy w dalszej czci punktu.
'sprawdzenie, czy naley przetwarza po stronie klienta
I@ bUseelientSide = True Then
oSQLXMLeommand.elientSideXml = True
Fnd I@
Dim oStream As System.IO.Stream
oStream = oSQLXMLeommand.FxecuteStream()
oStream.Position = 0
Dim oStreamReader As New System.IO.StreamReader(oStream)
txtResults.Text = oStreamReader.ReadToFnd()
oStreamReader.elose()
Jak mona wywnioskowa na podstawie przytoczonego kodu, uycie klauzuli FOR XML
w SQLXML jest cakiem proste. Najtrudniejsz spraw jest zapewnienie, e zapytanie
FOR XML zostanie wykonane poprawnie i zwrci prawidowe wyniki.
312
Jak wida, w przypadku prostych operacji takich jak wywietlanie danych XML uycie obiektu czytajcego dane XML jest jedynie dodatkowym utrudnieniem, poniewa
w celu wywietlenia danych trzeba najpierw wykona ich parsowanie. Jednak gdy
trzeba uzyska dodatkowe informacje na temat danych XML, takie jak liczba atrybutw albo elementw, lub gdy konieczne jest uycie wikszego zakresu operacji nawigowania w danych, wwczas wanie obiekt XMLTextReader najlepiej si sprawdzi.
313
Nastpnie jako typ polecenia trzeba wskaza szablon dopiero wtedy moliwe bdzie
wykonanie zapytania SQL z szablonem. W aplikacji wskazujemy rwnie element
gwny oraz ciek do pliku adnotowanego schematu XSD:
oSQLXMLeommand.eommandType = Microso@t.Data.SqlXml.SqlXmleommandType.Template
oSQLXMLeommand.SchemaPath = txtXMLSchema.Text
oSQLXMLeommand.RootTag = "ROOT"
314
Podsumowanie
W rozdziale opisano technologie obsugi jzyka XML dostpne w SQL Serverze 2000
oraz w SQL Serverze 2005. Do technologii tych nale OPENXML, rozszerzenia zapyta
FOR XML, obiekt XML Bulkload oraz szereg rozwiza SQLXML. W nastpnym rozdziale przedstawionych zostanie kilka obecnych w SQL Serverze 2005 dodatkowych
rozwiza w zakresie obsugi danych XML. Opisane zostan rwnie zmiany, jakim
ulegy niektre rozwizania zaprezentowane w tym rozdziale.