Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy do:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
System Platform Analitycznych (PDW)
Baza danych SQL w Microsoft Fabric
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)