Udostępnij za pośrednictwem


Porównywanie typizowanego kodu XML z nietypowanym kodem XML

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Można tworzyć zmienne, parametry i kolumny typu xml. Opcjonalnie można skojarzyć kolekcję schematów XML ze zmienną, parametrem lub kolumną typu xml. W tym przypadku egzemplarz typu danych xml jest nazywany typem . W przeciwnym razie wystąpienie XML jest nazywane nietypowym.

Poprawnie sformułowany kod XML i typ danych XML

Typ danych xml implementuje standardowy XML typu danych ISO. W związku z tym może przechowywać dobrze sformułowane dokumenty XML w wersji 1.0, a także tak zwane fragmenty zawartości XML z węzłami tekstowymi i dowolną liczbą elementów najwyższego poziomu w nietypowej kolumnie XML. System sprawdza, czy dane są prawidłowo sformułowane, nie wymagają powiązania kolumny ze schematami XML i odrzucają dane, które nie są prawidłowo sformułowane w sensie rozszerzonym. Dotyczy to również nietypowych zmiennych i parametrów XML.

Schematy XML

Schemat XML zawiera następujące elementy:

  • Ograniczenia walidacji. Za każdym razem, gdy typizowane wystąpienie XML jest przypisywane lub modyfikowane, program SQL Server weryfikuje wystąpienie.

  • Informacje o typie danych. Schematy zawierają informacje o typach atrybutów i elementów w wystąpieniu typu danych xml. Informacje o typie zapewniają bardziej precyzyjną semantykę operacyjną wartości zawartych w wystąpieniu, niż jest to możliwe w przypadku nietypowych xml. Na przykład operacje arytmetyczne dziesiętne mogą być wykonywane na wartości dziesiętnej, ale nie na wartości ciągu. W związku z tym typizowane magazyny XML mogą być znacznie bardziej kompaktowe niż nietypowy kod XML.

Wybieranie typizowanego lub nietypizowanego XML

W następujących sytuacjach użyj nieokreślonego typu danych xml :

  • Nie masz schematu dla danych XML.

  • Masz schematy, ale nie chcesz, aby serwer weryfikował dane. Czasami dzieje się tak, gdy aplikacja przeprowadza weryfikację po stronie klienta przed zapisaniem danych na serwerze lub tymczasowo przechowuje dane XML, które są nieprawidłowe zgodnie ze schematem, lub używa składników schematu, które nie są obsługiwane na serwerze.

W następujących sytuacjach użyj typowanego typu danych xml:

  • Masz schematy danych XML i chcesz, aby serwer weryfikował dane XML zgodnie ze schematami XML.

  • Chcesz skorzystać z optymalizacji zapytań i magazynowania na podstawie informacji o typie.

  • Chcesz lepiej wykorzystać informacje o typie podczas kompilacji zapytań.

Wpisane kolumny XML, parametry i zmienne mogą przechowywać dokumenty XML lub zawartość. Należy jednak określić za pomocą flagi, czy przechowujesz dokument lub zawartość w momencie deklaracji. Ponadto należy podać kolekcję schematów XML. Określ dokument, jeśli każde wystąpienie XML ma dokładnie jeden element najwyższego poziomu. W przeciwnym razie użyj CONTENT. Kompilator zapytań używa flagi DOCUMENT w sprawdzaniu typów podczas kompilacji zapytań w celu wnioskowania pojedynczych elementów najwyższego poziomu.

Tworzenie wpisanego kodu XML

Aby można było utworzyć wpisane zmienne, parametry lub kolumny xml xml, należy najpierw zarejestrować kolekcję schematów XML przy użyciu CREATE XML SCHEMA COLLECTION (Transact-SQL). Następnie można skojarzyć kolekcję schematów XML ze zmiennymi, parametrami lub kolumnami xml typu danych.

W poniższych przykładach do określania nazwy kolekcji schematów XML jest używana dwuczęściowa konwencja nazewnictwa. Pierwsza część to nazwa schematu, a druga część to nazwa kolekcji schematów XML.

Przykład: kojarzenie kolekcji schematów ze zmienną typu XML

Poniższy przykład tworzy zmienną typu xml i kojarzy z nią kolekcję schematów. Kolekcja schematów określona w przykładzie jest już importowana w bazie danych AdventureWorks.

DECLARE @x xml (Production.ProductDescriptionSchemaCollection);

Przykład: określanie schematu dla kolumny typu xml

Poniższy przykład tworzy tabelę z kolumną typu xml i określa schemat dla kolumny.

CREATE TABLE T1(
Col1 int,
Col2 xml (Production.ProductDescriptionSchemaCollection));

Przykład: przekazywanie parametru typu XML do procedury składowanej

Poniższy przykład przekazuje parametr typu xml do procedury składowanej i określa schemat dla zmiennej.

CREATE PROCEDURE SampleProc
  @ProdDescription xml (Production.ProductDescriptionSchemaCollection)
AS
...

Zwróć uwagę na następujące kwestie dotyczące kolekcji schematów XML:

  • Kolekcja schematów XML jest dostępna tylko w bazie danych, w której została zarejestrowana przy użyciu Tworzenie kolekcji schematów XML.

  • Jeśli rzutujesz ciąg na typowy xml typ danych, analizowanie wykonuje również walidację i wpisywanie na podstawie przestrzeni nazw schematu XML w określonej kolekcji.

  • Można rzutować z typowanego xml na nietypowanego xml i odwrotnie.

Aby uzyskać więcej informacji na temat innych sposobów generowania kodu XML w programie SQL Server, zobacz Create Instances of XML Data. Po wygenerowaniu kodu XML można przypisać go do zmiennej typu danych xml lub przechowywać w kolumnach typu xml w celu dodatkowego przetwarzania.

W hierarchii typów danych, typ danych xml pojawia się poniżej sql_variant i typów zdefiniowanych przez użytkownika, ale powyżej dowolnego z typów wbudowanych.

Przykład: określanie aspektów w celu ograniczenia typizowanej kolumny XML

W przypadku kolumn typu xml można ograniczyć kolumnę tak, aby zezwalała tylko na pojedyncze elementy najwyższego poziomu dla każdego przechowywanego w nim wystąpienia. W tym celu należy określić opcjonalny wymiar DOCUMENT podczas tworzenia tabeli, jak pokazano w poniższym przykładzie:

CREATE TABLE T(Col1 xml
   (DOCUMENT Production.ProductDescriptionSchemaCollection));
GO
DROP TABLE T;
GO

Domyślnie wystąpienia przechowywane w typowanej kolumnie xml są przechowywane jako zawartość XML, a nie jako dokumenty XML. Umożliwia to wykonanie następujących czynności:

  • Zero lub wiele elementów najwyższego poziomu

  • Węzły tekstowe w elementach najwyższego poziomu

Możesz również jawnie określić to zachowanie, dodając element CONTENT, jak pokazano w poniższym przykładzie.

CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection));
GO -- Default

Możesz określić opcjonalne aspekty DOCUMENT/CONTENT w dowolnym miejscu, w którym definiujesz typ xml (typ xml). Na przykład podczas tworzenia wpisanej zmiennej xml można dodać aspekt DOCUMENT/CONTENT, jak pokazano poniżej:

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);

Definicja typu dokumentu (DTD)

Kolumny, zmienne i parametry typu danych XML można określić przy użyciu schematu XML, ale nie przy użyciu DTD. Jednak wbudowany DTD może służyć zarówno do nieopisanego, jak i opisanego XML, aby podawać wartości domyślne oraz zastępować odwołania do jednostek ich rozwiniętą formą.

Elementy DTD można przekonwertować na dokumenty schematu XML przy użyciu narzędzi innych firm i załadować schematy XML do bazy danych.

Uaktualnianie typowanego XML w SQL Server 2005

Program SQL Server 2008 (10.0.x) dokonał kilku rozszerzeń obsługi schematu XML, w tym obsługę luźnej walidacji, ulepszoną obsługę xs:date, xs:time i xs:dateTime danych wystąpienia, a także dodano obsługę typów list i unii. W większości przypadków zmiany nie wpływają na proces aktualizacji. Jeśli jednak użyto kolekcji schematów XML w programie SQL Server 2005 (9.x), które zezwalały na wartości typu xs:date, xs:timelub xs:dateTime (lub dowolnego podtypu), następujące kroki uaktualniania występują podczas dołączania bazy danych programu SQL Server 2005 (9.x) do nowszej wersji programu SQL Server:

  1. Dla każdej kolumny XML, typizowanej za pomocą kolekcji schematów XML, która zawiera elementy lub atrybuty typizowane jako xs:anyType, xs:anySimpleType, xs:date lub dowolny z ich podtypów, xs:time lub dowolny z ich podtypów, lub xs:dateTime lub dowolny z ich podtypów, lub jako typy union lub list zawierające dowolny z tych typów, następuje:

    1. Wszystkie indeksy XML w kolumnie zostaną wyłączone.

    2. Wszystkie wartości programu SQL Server 2005 (9.x) będą nadal reprezentowane w strefie czasowej Z, ponieważ zostały znormalizowane do strefy czasowej Z.

    3. Wszystkie xs:date lub xs:dateTime wartości, które są mniejsze niż 1 stycznia roku 1, spowodują błąd środowiska uruchomieniowego, gdy indeks zostanie przebudowany lub instrukcje XQuery lub XML-DML zostaną wykonane względem typu danych xml zawierającego te wartości.

  2. Wszelkie ujemne lata w xs:date lub xs:dateTime właściwościach lub wartościach domyślnych w kolekcji schematu XML zostaną automatycznie zaktualizowane do najmniejszej wartości dozwolonej przez podstawowy typ xs:date lub xs:dateTime (na przykład 0001-01-01T00:00:00.0000000Z dla xs:dateTime).

Nadal można użyć instrukcji Transact-SQL SELECT, aby pobrać cały typ danych xml, nawet jeśli zawiera ujemne lata. Zaleca się, aby zastąpić ujemne lata rokiem mieszczącym się w nowo obsługiwanym zakresie lub zmienić typ elementu albo atrybutu na xs:string.

Zobacz też