Udostępnij przez


Wykorzystanie typów danych XML

Dotyczy do:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSystem Platform Analitycznych (PDW)Baza danych SQL w Microsoft Fabric

pobierz sterownik OLE DB

SQL Server 2005 (9.x) wprowadził typ danych xml , który umożliwia przechowywanie dokumentów i fragmentów XML w bazie danych SQL Server. Typ danych XML jest wbudowanym typem danych w programie SQL Server i jest w jakiś sposób podobny do innych wbudowanych typów, takich jak int i varchar. Podobnie jak w przypadku innych wbudowanych typów, można użyć typu danych xml jako typu kolumny podczas tworzenia tabeli; jako typ zmiennej, typ parametru lub typ funkcji-zwrot; lub w funkcjach CAST i CONVERT.

Zagadnienia dotyczące programowania

XML może być samoopisujący, ponieważ opcjonalnie może zawierać nagłówek XML określający kodowanie dokumentu, na przykład:

<?xml version="1.0" encoding="windows-1252"?><doc/>

Standard XML opisuje, jak procesor XML może wykrywać kodowanie używane w dokumencie, analizując pierwsze kilka bajtów dokumentu. Istnieją możliwości, że kodowanie określone przez aplikację może kolidować z kodowaniem określonym w dokumencie. Dla dokumentów przekazanych jako parametry ograniczone, XML jest traktowany przez SQL Server jako dane binarne, więc nie dokonuje się konwersji, a parser XML może bez problemów korzystać z kodowania określonego w dokumencie. Jednak dla danych XML powiązanych jako WSTR aplikacja musi zapewnić, że dokument jest zakodowany jako Unicode. W takim przypadku można załadować dokument do DOM, zmienić kodowanie na Unicode i zszerzyć dokument. Jeśli ten krok nie zostanie wykonany, mogą wystąpić konwersje danych, co skutkuje nieprawidłowym lub uszkodzonym XML.

Istnieje również ryzyko konfliktu, gdy XML jest określone w literalach. Na przykład następujące są nieprawidłowe:

INSERT INTO xmltable(xmlcol) VALUES('<?xml version="1.0" encoding="UTF-16"?><doc/>')

INSERT INTO xmltable(xmlcol) VALUES(N'<?xml version="1.0" encoding="UTF-8"?><doc/>')

Sterownik OLE DB dla programu SQL Server

DBTYPE_XML jest nowym typem danych specyficznym dla XML w sterowniku OLE DB dla SQL Server. Dodatkowo dane XML mogą być dostępne przez istniejące typy OLE DB: DBTYPE_BYTES, DBTYPE_WSTR, DBTYPE_BSTR, DBTYPE_XML, DBTYPE_STR, DBTYPE_VARIANT i DBTYPE_IUNKNOWN. Dane przechowywane w kolumnach typu XML można pobrać z kolumny w zestawie wierszy OLE DB Driver for SQL Server w następujących formatach:

  • Ciąg tekstowy

  • Strumień sekwencyjny

Uwaga / Notatka

Sterownik OLE DB dla SQL Server nie zawiera czytnika SAX, ale ISequentialStream można łatwo przekazać do obiektów SAX i DOM w MSXML.

ISequentialStream powinien być używany do pobierania dużych dokumentów XML. Te same techniki stosowane dla innych typów dużych wartości dotyczą także XML. Więcej informacji można znaleźć w artykule Używanie typów dużych wartości.

Dane przechowywane w kolumnach typu XML w zestawie wierszy mogą być również pobierane, wstawiane lub aktualizowane przez aplikację za pomocą standardowych interfejsów, takich jak IRow::GetColumns, IRowChange::SetColumns oraz ICommand::Execute. Podobnie jak w przypadku pobierania, program aplikacyjny może przekazać do sterownika OLE DB dla SQL Server łańcuch tekstowy lub ISequentialStream .

Uwaga / Notatka

Aby przesłać dane XML w formacie ciągu przez interfejs ISequentialStream , musisz uzyskać ISequentialStream , określając DBTYPE_IUNKNOWN i ustawiając jego argument pObject na null w bindingu.

Gdy pobrane dane XML są obcięte z powodu zbyt małego bufora konsumenta, długość może być zwrócona jako 0xffffffff, co oznacza, że długość jest nieznana. To zachowanie jest zgodne z implementacją jako typu danych przesyłanych do klienta bez wysyłania informacji o długości przed rzeczywistymi danymi. W niektórych przypadkach rzeczywista długość może być zwrócona, gdy dostawca buforował całą wartość, na przykład IRowset::GetData oraz tam, gdzie przeprowadza się konwersję danych.

Dane XML przesyłane do SQL Server są traktowane przez serwer jako dane binarne. To zachowanie zapobiega wszelkim konwersjom i pozwala parserowi XML automatycznie wykrywać kodowanie XML. Pozwala to na akceptację szerszego zakresu dokumentów XML (na przykład tych zakodowanych w UTF-8) jako wejścia do SQL Server.

Jeśli wejścia XML jest powiązana DBTYPE_WSTR, aplikacja musi upewnić się, że jest już zakodowany w Unicode, aby uniknąć ewentualnych uszkodzeń spowodowanych niechcianymi konwersjami danych.

Wiązania danych i przymusy

Poniższa tabela opisuje wiązanie i przymus, które występują przy użyciu wymienionych typów danych z typem XML SQL Server.

Typ danych Do serwera

XML
Do serwera

Nie-XML
Z serwera

XML
Z serwera

Nie-XML
DBTYPE_XML Przejdź przez6,7 Błąd1 OK11, 6 Błąd8
DBTYPE_BYTES Przejdź przez6,7 N/D2 OK 11, 6 N/A 2
DBTYPE_WSTR Przejedź przez6,10 N/A 2 OK4, 6, 12 N/A 2
DBTYPE_BSTR Przejedź przez6,10 N/A 2 OK 3 N/A 2
DBTYPE_STR OK6, 9, 10 N/A 2 OK5, 6, 12 N/A 2
DBTYPE_IUNKNOWN Strumień bajtów przez ISequentialStream7 N/A 2 Strumień bajtów przez ISequentialStream11 N/A 2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Przejdź przez6,7 N/A 2 N/A N/A 2
DBTYPE_VARIANT (VT_BSTR) Przejedź przez6,10 N/A 2 OK3 N/A 2

1Jeśli typ serwera inny niż DBTYPE_XML jest określony za pomocą ICommandWithParameters::SetParameterInfo, a typ accessora to DBTYPE_XML, po wykonaniu instrukcji występuje błąd (DB_E_ERRORSOCCURRED, status parametru to DBSTATUS_E_BADACCESSOR); w przeciwnym razie dane są wysyłane do serwera, ale serwer zwraca błąd wskazujący, że nie ma ukrytej konwersji z XML na typ danych parametru.

cyfra arabskaWykraczające poza zakres tego artykułu.

3Format to UTF-16, bez znaku kolejności (BOM), bez specyfikacji kodowania, bez zakończenia zerowego.

4Format to UTF-16, bez BOM, bez specyfikacji kodowania, zakończenie zera.

5Format to znaki wielobajtowe kodowane na stronie kodowej klienta z terminatorem null (zakończenie zerowe). Konwersja z serwerem dostarczonego Unicode może powodować uszkodzenia danych, dlatego takie wiązanie jest odradzane.

6BY_REF można wykorzystać.

7Dane UTF-16 muszą zaczynać się od BOM. Jeśli nie, kodowanie może nie być poprawnie rozpoznane przez serwer.

8Walidacja może nastąpić w momencie tworzenia accessora lub podczas pobierania. Błąd to DB_E_ERRORSOCCURRED, status wiązania ustawiony na DBBINDSTATUS_UNSUPPORTEDCONVERSION.

9Dane są konwertowane do Unicode za pomocą strony kodowej klienta przed wysłaniem na serwer. Jeśli kodowanie dokumentu nie odpowiada stronie kodowej klienta, może dojść do uszkodzenia danych, dlatego takie wiązanie jest zdecydowanie odradzane.

10Do danych wysyłanych na serwer zawsze dodaje się BOM. Jeśli dane zaczynały się już od BOM, na początku bufora znajdą się dwa BOM. Serwer używa pierwszego BOM, aby rozpoznać kodowanie jako UTF-16, a następnie go odrzuca. Drugi znak BOM interpretowany jest jako znak nieprzerwanej spacji o zerowej szerokości.

11Format to UTF-16, bez specyfikacji kodowania, do danych otrzymanych z serwera dodaje się BOM. Jeśli serwer zwróci pusty ciąg tekstów, aplikacja nadal zwraca listę danych. Jeśli długość bufora wynosi nieparzystą liczbę bajtów, dane są poprawnie obcinane. Jeśli cała wartość zostanie zwrócona w kawałkach, można je łączyć, aby odtworzyć poprawną wartość.

12Jeśli długość bufora jest mniejsza niż dwa znaki — czyli nie ma wystarczająco dużo miejsca na zakończenie wartości — zgłaszany jest błąd przepełnienia.

Uwaga / Notatka

Nie zwraca się danych dla wartości NULL XML.

Standard XML wymaga, aby XML zakodowany w UTF-16 zaczynał się od znaku kolejności bajtów (BOM), 0xFEFF kodem znakowym UTF-16. Podczas pracy z wiązaniami WSTR i BSTR, sterownik OLE DB dla SQL Server nie wymaga ani nie dodaje bazy BOM, ponieważ kodowanie jest przez to powiązanie sugerowane. Pracując z przypisaniami BYTES, XML lub IUND, celem jest ułatwienie obsługi innych procesorów XML i systemów pamięci masowej. W takim przypadku BOM powinien być obecny wraz z XML zakodowanym przez UTF-16, a aplikacja nie musi się przejmować samym kodowaniem, ponieważ większość procesorów XML (w tym SQL Server) wyprowadza kodowanie, analizując pierwsze bajty wartości. Dane XML otrzymane z OLE DB Driver for SQL Server z użyciem wiązań BYTES, XML lub IUNKNOWN są zawsze kodowane w UTF-16 z BOM i bez deklaracji kodowania wbudowanego.

Konwersje danych dostarczane przez usługi rdzeniowe OLE DB (IDataConvert) nie mają zastosowania do DBTYPE_XML.

Walidacja odbywa się, gdy dane są przesyłane na serwer. Walidacja i kodowanie po stronie klienta powinny być realizowane przez Twoją aplikację. Zaleca się, aby nie przetwarzać danych XML bezpośrednio, lecz używać czytnika DOM lub SAX do ich przetwarzania.

DBTYPE_NULL i DBTYPE_EMPTY mogą być ograniczone dla parametrów wejściowych, ale nie dla parametrów wyjściowych czy wyników. Gdy jest ograniczenie dla parametrów wejściowych, status musi być ustawiony na DBSTATUS_S_ISNULL lub DBSTATUS_S_DEFAULT.

DBTYPE_XML można przekształcić na DBTYPE_EMPTY i DBTYPE_NULL, DBTYPE_EMPTY na DBTYPE_XML, ale DBTYPE_NULL nie można przekształcić na DBTYPE_XML. To jest zgodne z DBTYPE_WSTR.

DBTYPE_IUNKNOWN jest powiązaniem wspieranym (jak pokazano w poprzedniej tabeli), ale nie ma konwersji między DBTYPE_XML a DBTYPE_IUNKNOWN. DBTYPE_IUNKNOWN nie może być używany z DBTYPE_BYREF.

Dodatki i zmiany w zestawie wierszy w OLE DB

Sterownik OLE DB dla SQL Server dodaje nowe wartości lub zmiany do wielu podstawowych zestawów schematów OLE DB.

Wiersze COLUMNS i PROCEDURE_PARAMETERS schematów

Dodatki do zestawów wierszy COLUMNS i PROCEDURE_PARAMETERS schematu obejmują następujące kolumny:

Nazwa kolumny Typ Description
SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Nazwa katalogu, w którym zdefiniowana jest kolekcja schematów XML. NULL dla kolumny niebędącej XML lub nietypowanej kolumny XML.
SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Nazwa schematu, w którym zdefiniowana jest kolekcja schematów XML. NULL dla kolumny niebędącej XML lub nietypowanej kolumny XML.
SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Nazwa kolekcji schematów XML. NULL dla kolumny niebędącej XML lub nietypowanej kolumny XML.

Zestaw wierszy PROVIDER_TYPES schematu

W wierszu PROVIDER_TYPES schematu wartość COLUMN_SIZE dla typu danych xml wynosi 0, a DATA_TYPE to DBTYPE_XML.

Zestaw wierszy SS_XMLSCHEMA Schema

Wprowadzono nowy SS_XMLSCHEMA wierszy w zestawie schematu, który pozwala klientom pobierać informacje o schemacie XML. Zestaw wierszy SS_XMLSCHEMA zawiera następujące kolumny:

Nazwa kolumny Typ Description
SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Katalog, do którego należy kolekcja XML.
SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Schemat, do którego należy kolekcja XML.
SCHEMACOLLECTIONNAME DBTYPE_WSTR Nazwa kolekcji schematów XML dla typowanych kolumn XML jest NULL, w przeciwnym razie NULL.
TARGETNAMESPACEURI DBTYPE_WSTR Docelowa przestrzeń nazw schematu XML.
SCHEMACONTENT DBTYPE_WSTR Zawartość schematu XML.

Każdy schemat XML jest ograniczony według nazwy katalogu, nazwy schematu, nazwy zbioru schematu oraz docelowej przestrzeni nazw Uniform Resource Identifier (URI). Ponadto zdefiniowany jest nowy GUID o nazwie DBSCHEMA_XML_COLLECTIONS. Liczba ograniczeń i kolumn ograniczonych dla zbioru wierszy schematu SS_XMLSCHEMA jest zdefiniowana następująco.

GUID Liczba ograniczeń Kolumny ograniczone
DBSCHEMA_XML_COLLECTIONS 4 SCHEMACOLLECTION_CATALOGNAME

SCHEMACOLLECTION_SCHEMANAME

SCHEMACOLLECTIONNAME

TARGETNAMESPACEURI

Dodatki i zmiany w zbiorach właściwości OLE DB

Sterownik OLE DB dla SQL Server dodaje nowe wartości lub zmiany do wielu podstawowych zestawów właściwości OLE DB.

Zbiór własności DBPROPSET_SQLSERVERPARAMETER

Aby wspierać typ danych xml przez OLE DB, OLE DB Driver for SQL Server implementuje nowy zestaw właściwości DBPROPSET_SQLSERVERPARAMETER, który zawiera następujące wartości.

Name Typ Description
SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Nazwa katalogu (bazy danych), w której zdefiniowana jest kolekcja schematów XML. Część trzyczęściowego identyfikatora nazwy SQL.
SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Nazwa schematu XML w kolekcji schematów. Część identyfikatora SQL -part nazwy.
SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Nazwa kolekcji schematów XML w katalogu Część identyfikatora SQL trzy -part nazwy.

Zbiór własności DBPROPSET_SQLSERVERCOLUMN

Aby wspierać tworzenie tabel w interfejsie ITableDefinition , sterownik OLE DB dla SQL Server dodaje trzy nowe kolumny do zestawu właściwości DBPROPSET_SQLSERVERCOLUMN.

Name Typ Description
SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME VT_BSTR Dla typowanych kolumn XML ta właściwość jest ciągiem znaków określającym nazwę katalogu, w którym przechowywany jest schemat XML. Dla innych typów kolumn ta własność zwraca pusty ciąg znaków.
SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME VT_BSTR Dla typowanych kolumn XML ta właściwość jest ciągiem tekstów określającym nazwę schematu XML definiującego tę kolumnę.
SSPROP_COL_XML_SCHEMACOLLECTIONNAME VT_BSTR Dla typowanych kolumn XML ta właściwość jest ciągiem znaków określającym nazwę zbioru schematów XML definiujących tę wartość.

Podobnie jak wartości SSPROP_PARAM, wszystkie te właściwości są opcjonalne i domyślnie ustawione na puste. SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME i SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME mogą być określone tylko wtedy, gdy SSPROP_COL_XML_SCHEMACOLLECTIONNAME jest określone. Podczas przekazywania XML do serwera, jeśli te wartości są uwzględnione, są one sprawdzane pod kątem ich istnienia (ważności) względem bieżącej bazy danych, a dane instancji są weryfikowane względem schematu. We wszystkich przypadkach, aby były poprawne, są albo wszystkie puste, albo całkowicie wypełnione.

Dodatki i zmiany interfejsu OLE DB

Sterownik OLE DB dla SQL Server dodaje nowe wartości lub zmiany do wielu podstawowych interfejsów OLE DB.

Interfejs ISSCommandWithParameters

Aby wspierać typ danych xml przez OLE DB, OLE DB Driver for SQL Server wprowadza szereg zmian, w tym dodanie interfejsu ISSCommandWithParameters . Ten nowy interfejs dziedziczy z rdzenia interfejsu OLE DB ICommandWithParameters. Oprócz trzech metod odziedziczonych z ICommandWithParameters; GetParameterInfo, MapParameterNames oraz SetParameterInfo; ISSCommandWithParameters dostarcza metody GetParameterProperties oraz SetParameterProperties , które są używane do obsługi specyficznych dla serwera typów danych.

Uwaga / Notatka

Interfejs ISSCommandWithParameters również wykorzystuje nową strukturę SSPARAMPROPS.

Interfejs IColumnsRowset

Sterownik OLE DB dla SQL Server dodaje następujące kolumny specyficzne dla SQL Server do zestawu wierszy zwracanego przez metodę IColumnRowset::GetColumnsRowset . Kolumny te zawierają trzyczęściową nazwę kolekcji schematów XML. Dla kolumn nie-XML lub nietypowanych kolumn XML wszystkie trzy kolumny przyjmują domyślną wartość NULL.

Nazwa kolumny Typ Description
DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Katalog, do którego należy kolekcja schematów XML,

W przeciwnym razie NULL.
DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Schemat należy do kolekcji schematów XML. W przeciwnym razie NULL.
DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Nazwa kolekcji schematów XML dla typowanej kolumny XML jest NULL w przeciwnym razie.

Interfejs IRowset

Instancja XML w kolumnie XML jest pobierana za pomocą metody IRowset::GetData . W zależności od przypisania określonego przez klienta, instancję XML można pobrać jako DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML, DBTYPE_STR, DBTYPE_BYTES lub jako interfejs przez DBTYPE_IUNKNOWN. Jeśli konsument poda DBTYPE_BSTR, DBTYPE_WSTR lub DBTYPE_VARIANT, dostawca konwertuje instancję XML na typ żądany przez użytkownika i umieszcza ją w lokalizacji określonej w odpowiednim powiązaniu.

Jeśli konsument określi DBTYPE_IUNKNOWN i ustawi argument pObject na NULL lub argument pObject na IID_ISequentialStream, dostawca zwraca interfejs ISequentialStream do konsumenta, aby mógł on przesyłać dane XML z kolumny. ISequentialStream zwraca wtedy dane XML jako strumień znaków Unicode.

Zwracając wartość XML związaną z DBTYPE_IUNKNOWN, dostawca zgłasza wartość rozmiaru .sizeof (IUnknown *) To zachowanie jest zgodne z podejściem, gdy kolumna jest ograniczona jako DBTYPE_IUnknown lub DBTYPE_IDISPATCH, a także z DBTYPE_IUNKNOWN/ISequentialStream, gdy dokładny rozmiar kolumny nie może być określony.

Interfejs IRowsetChange

Istnieją dwa sposoby, w jakie użytkownik może zaktualizować instancję XML w kolumnie. Pierwsza to obiekt pamięci masowej ISequentialStream stworzony przez dostawcę. Konsument może wywołać metodę ISequentialStream::Write , aby bezpośrednio zaktualizować instancję XML zwróconą przez dostawcę.

Drugie podejście to metody IRowsetChange::SetData lub IRowsetChange::InsertRow . W tym podejściu instancja XML w buforze konsumenta może być określona w powiązaniu typu DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML lub DBTYPE_IUNKNOWN.

Jeśli określono DBTYPE_BSTR, DBTYPE_WSTR lub DBTYPE_VARIANT, dostawca przechowuje instancję XML znajdującą się w buforze konsumenckim w odpowiedniej kolumnie.

Jeśli DBTYPE_IUNKNOWN/ISequentialStream jest określony, a konsument nie określi żadnego obiektu pamięci, musi wcześniej utworzyć obiekt ISequentialStream , powiązać dokument XML z tym obiektem, a następnie przekazać obiekt dostawcy za pomocą metody IRowsetChange::SetData . Konsument może także utworzyć obiekt pamięci, ustawić argument pObject na IID_ISequentialStream, stworzyć obiekt ISequentialStream , a następnie przekazać obiekt ISequentialStream do metody IRowsetChange::SetData . W obu przypadkach dostawca może pobrać obiekt XML przez obiekt ISequentialStream i wstawić go do właściwej kolumny.

Interfejs IRowsetUpdate

Interfejs IRowsetUpdate oferuje funkcje opóźnionych aktualizacji. Dane udostępnione w zestawach wierszy nie są udostępniane innym transakcjom, dopóki konsument nie wywoła metody IRowsetUpdate::Update .

Interfejs IRowsetFind

Metoda IRowsetFind::FindNextRow nie działa z typem danych xml . Gdy IRowsetFind::FindNextRow zostanie wywołany, a argument hAccessor podaje kolumnę DBTYPE_XML, zwraca się DB_E_BADBINDINFO. Dzieje się to niezależnie od typu przeszukiwanej kolumny. Dla dowolnego innego typu wiązania FindNextRow nie wychodzi z DB_E_BADCOMPAREOP, jeśli przeszukiwana kolumna należy do typu danych xml .

Zobacz też

OLE DB Driver for SQL Server Features
ISSCommandWithParameters (OLE DB)