Verwenden von XML-Datentypen

In SQL Server 2005 wurde ein neuer XML-Datentyp eingeführt, der das Speichern von XML-Dokumenten und -Fragmenten in SQL Server-Datenbanken unterstützt. Der xml-Datentyp ist ein integrierter Datentyp in SQL Server und ähnelt in einigen Punkten anderen integrierten Typen wie int und varchar. Wie andere integrierte Typen können Sie den xml-Datentyp beim Erstellen von Tabellen als Variablen-, Parameter- oder Funktionsrückgabespaltentyp oder in CAST- und CONVERT-Funktionen verwenden.

Überlegungen zur Programmierung

XML kann selbstbeschreibend sein, da optional ein XML-Header eingefügt werden kann, der die Codierung des Dokuments angibt, zum Beispiel:

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

Der XML-Standard beschreibt, wie ein XML-Prozessor die für ein Dokument verwendete Codierung durch Überprüfen der ersten Bytes des Dokuments erkennen kann. Es ist möglich, dass die von der Anwendung festgelegte Codierung einen Konflikt mit der im Dokument angegebenen Codierung auslöst. Für Dokumente, die als gebundene Parameter übergeben werden, wird XML von SQL Server als binäre Daten behandelt, es werden also keine Konvertierungen vorgenommen, und der XML-Parser kann die im Dokument angegebene Codierung problemlos verwenden. Für XML-Daten, die als WSTR gebunden sind, muss die Anwendung jedoch sicherstellen, dass das Dokument in Unicode codiert ist. Daraufhin wird das Dokument möglicherweise in ein DOM geladen, die Codierung in Unicode geändert und das Dokument serialisiert. Wenn dies nicht gemacht wird, finden eventuell Datenkonvertierungen statt und führen zu ungültigem oder fehlerhaftem XML.

Konflikte können auch auftreten, wenn XML in Literalen angegeben wird. Folgendes ist beispielsweise ungültig:

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/>')

SQL Server Native Client OLE DB-Anbieter

DBTYPE_XML ist ein neuer Datentyp für XML im SQL Server Native Client OLE DB-Anbieter. Zusätzlich können XML-Daten über die vorhandenen OLE DB-Typen DBTYPE_BYTES, DBTYPE_WSTR, DBTYPE_BSTR, DBTYPE_XML, DBTYPE_STR, DBTYPE_VARIANT und DBTYPE_IUNKNOWN aufgerufen werden. Daten, die in XML-Spalten gespeichert wurden, können in einem SQL Server Native Client OLE DB-Anbieter-Rowset in den folgenden Formaten aus der Spalte abgerufen werden:

  • Textzeichenfolge

  • ISequentialStream

HinweisHinweis

Der SQL Server Native Client OLE DB-Anbieter umfasst keinen SAX-Reader, aber ISequentialStream kann einfach mit MSXML an SAX- und DOM-Objekte übergeben werden.

ISequentialStream sollte für den Abruf großer XML-Dokumente verwendet werden. Die für andere große Werttypen verwendeten Techniken gelten auch für XML. Weitere Informationen finden Sie unter Verwenden von Datentypen mit umfangreichen Werten.

Daten, die in XML-Spaltentypen in einem Rowset gespeichert sind, können über die bekannten Schnittstellen wie IRow::GetColumns, IRowChange::SetColumns und ICommand::Execute abgerufen, eingefügt oder aktualisiert werden. Ähnlich wie beim Abrufen kann die Anwendung entweder eine Textzeichenfolge oder einen ISequentialStream an den SQL Server Native Client OLE DB-Anbieter übergeben.

HinweisHinweis

Um XML-Daten im Zeichenfolgenformat über die ISequentialStream-Schnittstelle zu senden, müssen Sie ISequentialStream durch Angabe von DBTYPE_IUNKNOWN abrufen und das Argument pObject in der Bindung auf Null setzen.

Wenn abgerufene XML-Daten abgeschnitten werden, weil der Consumerpuffer zu klein ist, wird die Länge möglicherweise als 0xffffffff zurückgegeben, was heißt, dass die Länge unbekannt ist. Dies ist mit der Implementierung als Datentyp, der als Datenstrom an den Client gesendet wird, ohne Längeninformationen vorab zu senden, konsistent. In einigen Fällen kann die tatsächliche Länge zurückgegeben werden, wenn der Anbieter den gesamten Wert zwischengespeichert hat (z. B. IRowset::GetData) und wenn eine Datenkonvertierung durchgeführt wird.

An SQL Server gesendete XML-Daten werden vom Server als Binärdaten behandelt. Dies verhindert Konvertierungen und ermöglicht es dem XML-Parser, die XML-Codierung automatisch zu erkennen. Dadurch kann ein breiteres Spektrum von XML-Dokumenten (z. B. in UTF-8 codierte Dokumente) als Eingabe für SQL Server akzeptiert werden.

Wenn die XML-Eingabe als DBTYPE_WSTR gebunden ist, muss die Anwendung sicherstellen, dass sie bereits in Unicode codiert wurde, um mögliche Beschädigungen durch Datenkonvertierung zu verhindern.

Datenbindungen und -umwandlungen

Die folgende Tabelle veranschaulicht die Bindung und Umwandlung bei Verwendung der aufgeführten Datentypen mit einem SQL Server xml-Datentyp.

Datentyp

Zu Server

XML

Zu Server

Nicht-XML

Von Server

XML

Von Server

Nicht-XML

DBTYPE_XML

Pass-Through6,7

Fehler1

OK11, 6

Fehler8

DBTYPE_BYTES

Pass-Through6,7

N/V2

OK 11, 6

N/V 2

DBTYPE_WSTR

Pass-Through6,10

N/V 2

OK4, 6, 12

N/V 2

DBTYPE_BSTR

Pass-Through6,10

N/V 2

OK 3

N/V 2

DBTYPE_STR

OK6, 9, 10

N/V 2

OK5, 6, 12

N/V 2

DBTYPE_IUNKNOWN

Bytedatenstrom über ISequentialStream7

N/V 2

Bytedatenstrom über ISequentialStream11

N/V 2

DBTYPE_VARIANT (VT_UI1 | VT_ARRAY)

Pass-Through6,7

N/V 2

Nicht zutreffend

N/V 2

DBTYPE_VARIANT (VT_BSTR)

Pass-Through6,10

N/V 2

OK3

N/V 2

1Wenn ein anderer Servertyp als DBTYPE_XML mit ICommandWithParameters::SetParameterInfo angegeben wird und der Accessortyp DBTYPE_XML ist, tritt beim Ausführen der Anweisung ein Fehler auf (DB_E_ERRORSOCCURRED, der Parameterstatus ist DBSTATUS_E_BADACCESSOR). Andernfalls werden die Daten an den Server gesendet, der Server gibt jedoch einen Fehler zurück und zeigt an, dass keine implizite Konvertierung von XML in den Parameterdatentyp erfolgt.

2Nicht Bestandteil dieses Themas.

3Format ist UTF-16, keine Bytereihenfolge-Marke (Byte Order Mark, BOM), keine Codierspezifikation, keine NULL-Terminierung.

4Format ist UTF-16, keine BOM, keine Codierspezifikation, NULL-Terminierung.

5Format enthält Mehrbytezeichen, die in der Clientcodepage mit NULL-Abschlusszeichen codiert sind. Konvertierung aus vom Server bereitgestelltem Unicode verursacht möglicherweise Datenbeschädigung, daher wird diese Bindung nicht empfohlen.

6BY_REF kann verwendet werden.

7UTF-16-Daten müssen mit einer BOM starten. Wenn nicht, wird die Codierung möglicherweise nicht ordnungsgemäß vom Server erkannt.

8Überprüfung kann beim Erstellen des Accessors oder beim Abrufen erfolgen. Der Fehler ist DB_E_ERRORSOCCURRED, Bindungsstatus ist auf DBBINDSTATUS_UNSUPPORTEDCONVERSION festgelegt.

9Daten werden über die Clientcodepage in Unicode konvertiert, bevor sie an den Server gesendet werden. Falls die Dokumentcodierung nicht mit der Clientcodepage übereinstimmt, kann es zu Datenbeschädigungen kommen, daher wird diese Bindung nicht empfohlen.

10Zum Server gesendeten Daten wird immer eine BOM hinzugefügt. Falls die Daten bereits mit einer BOM begonnen haben, stehen dann zwei BOMs am Beginn des Puffers. Der Server verwendet die erste BOM, um die Codierung als UTF-16 zu erkennen, und verwirft sie dann. Die zweite BOM wird als geschütztes Leerzeichen mit Nullbreite interpretiert.

11Format ist UTF-16, keine Codierspezifikation, den vom Server empfangenen Daten wird eine BOM hinzugefügt. Wenn eine leere Zeichenfolge vom Server zurückgegeben wird, wird trotzdem eine BOM an die Anwendung zurückgegeben. Wenn die Pufferlänge eine ungerade Anzahl von Bytes ist, werden die Daten ordnungsgemäß abgeschnitten. Wenn der ganze Wert in Abschnitten zurückgegeben wird, können diese verkettet werden, um wieder den richtigen Wert zusammenzusetzen.

12Falls die Pufferlänge kleiner als zwei Zeichen ist, also nicht genug Platz für eine NULL-Terminierung bietet, wird ein Überlauffehler gemeldet.

HinweisHinweis

Es werden keine Daten für NULL XML-Werte zurückgegeben.

Der XML-Standard erfordert, dass UTF-16-codiertes XML mit einer Bytereihenfolge-Marke (BOM), UTF-16-Zeichencode 0xFEFF beginnt. Wenn Sie mit WSTR- und BSTR-Bindungen arbeiten, benötigt SQL Server Native Client keine BOM, da die Codierung durch die Bindung impliziert ist. Bei der Verwendung von BYTES-, XML- oder IUNKNOWN-Bindungen liegt das Hauptaugenmerk auf der einfachen Zusammenarbeit mit anderen XML-Prozessoren und Speichersystemen. In diesem Fall sollte für UTF-16-codiertes XML eine BOM vorhanden sein, und die Anwendung sollte sich nicht um die eigentliche Codierung kümmern, da die Mehrheit der XML-Prozessoren (einschließlich SQL Server) die Codierung nach Überprüfen des ersten Bytes des Wertes ableitet. XML-Daten, die von SQL Server Native Client unter Verwendung von BYTES-, XML- oder IUNKNOWN-Bindungen empfangen werden, sind immer in UTF-16 mit einer BOM und ohne eingebettete Codierdeklaration codiert.

Datenkonvertierungen durch OLE DB-Basisdienste (IDataConvert) sind nicht auf DBTYPE_XML anwendbar.

Die Überprüfung erfolgt, wenn Daten an den Server gesendet werden. Die clientseitige Gültigkeitsprüfung und Codierungsänderungen sollten von Ihrer Anwendung ausgeführt werden. Es wird nachdrücklich empfohlen, die XML-Daten nicht direkt zu verarbeiten, sondern einen DOM- oder SAX-Reader zur Verarbeitung zu verwenden.

DBTYPE_NULL und DBTYPE_EMPTY können für Eingabeparameter gebunden werden, aber nicht für Ausgabeparameter oder Ergebnisse. Ist der Status für Eingabeparameter gebunden, muss er auf DBSTATUS_S_ISNULL oder DBSTATUS_S_DEFAULT festgelegt werden.

DBTYPE_XML kann in DBTYPE_EMPTY und DBTYPE_NULL konvertiert werden, DBTYPE_EMPTY in DBTYPE_XML, aber DBTYPE_NULL kann nicht in DBTYPE_XML konvertiert werden. Dies stimmt mit DBTYPE_WSTR überein.

DBTYPE_IUNKNOWN ist eine unterstützte Bindung (wie in der Tabelle oben gezeigt), aber es gibt keine Konvertierungen zwischen DBTYPE_XML und DBTYPE_IUNKNOWN. DBTYPE_IUNKNOWN kann nicht mit DBTYPE_BYREF verwendet werden.

Hinzufügungen und Änderungen am OLE DB-Rowset

SQL Server Native Client fügt neue Werte oder Änderungen in zahlreichen Core-OLE DB-Schemarowsets hinzu.

Die COLUMNS- und PROCEDURE_PARAMETERS-Schemarowsets

Den COLUMNS- und PROCEDURE_PARAMETERS-Schemarowsets wurden unter anderem die folgenden Spalten hinzugefügt.

Spaltenname

Typ

Beschreibung

SS_XML_SCHEMACOLLECTION_CATALOGNAME

DBTYPE_WSTR

Der Name des Katalogs, in dem eine XML-Schemaauflistung definiert ist. NULL für eine Nicht-XML-Spalte oder nicht typisierte XML-Spalte.

SS_XML_SCHEMACOLLECTION_SCHEMANAME

DBTYPE_WSTR

Der Name des Schemas, in dem eine XML-Schemaauflistung definiert ist. NULL für eine Nicht-XML-Spalte oder nicht typisierte XML-Spalte.

SS_XML_SCHEMACOLLECTIONNAME

DBTYPE_WSTR

Der Name der XML-Schemaauflistung. NULL für eine Nicht-XML-Spalte oder nicht typisierte XML-Spalte.

Das PROVIDER_TYPES-Schemarowset

I- PROVIDER_TYPES-Schemarowset ist der COLUMN_SIZE-Wert für den xml-Datentyp 0, und DATA_TYPE ist DBTYPE_XML.

Das SS_XMLSCHEMA-Schemarowset

Ein neues Schemarowset SS_XMLSCHEMA wird eingeführt, mit dem Clients XML-Schema-Informationen abrufen können. Das SS_XMLSCHEMA-Rowset enthält folgende Spalten.

Spaltenname

Typ

Beschreibung

SCHEMACOLLECTION_CATALOGNAME

DBTYPE_WSTR

Der Katalog, zu dem eine XML-Auflistung gehört.

SCHEMACOLLECTION_SCHEMANAME

DBTYPE_WSTR

Das Schema, zu dem eine XML-Auflistung gehört.

SCHEMACOLLECTIONNAME

DBTYPE_WSTR

Der Name einer XML-Schemaauflistung für typisierte XML-Spalten, andernfalls NULL.

TARGETNAMESPACEURI

DBTYPE_WSTR

Der Zielnamespace eines XML-Schemas.

SCHEMACONTENT

DBTYPE_WSTR

Der Inhalt der XML-Schemas.

Jedes XML-Schema wird nach Katalogname, Schemaname, Schemaauflistung und Zielnamespace-URI (Uniform Resource Identifier) einem Bereich zugeordnet. Außerdem wird eine neue GUID mit dem Namen DBSCHEMA_XML_COLLECTIONS definiert. Die Anzahl von Einschränkungen und eingeschränkten Spalten für das SS_XMLSCHEMA-Schemarowset wird wie folgt definiert.

GUID

Anzahl der Einschränkungen

Eingeschränkte Spalten

DBSCHEMA_XML_COLLECTIONS

4

SCHEMACOLLECTION_CATALOGNAME

SCHEMACOLLECTION_SCHEMANAME

SCHEMACOLLECTIONNAME

TARGETNAMESPACEURI

Hinzufügungen und Änderungen an der OLE DB-Eigenschaftengruppe

SQL Server Native Client fügt neue Werte oder Änderungen in zahlreichen Core-OLE DB-Eigenschaftengruppen hinzu.

Die DBPROPSET_SQLSERVERPARAMETER-Eigenschaftengruppe

Um den xml-Datentyp über OLE DB zu unterstützen, implementiert SQL Server Native Client die neue DBPROPSET_SQLSERVERPARAMETER-Eigenschaftengruppe mit folgenden Werten.

Name

Typ

Beschreibung

SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME

DBTYPE_WSTR

Der Name des Katalogs (Datenbank), in dem eine XML-Schemaauflistung definiert ist. Teil des dreiteiligen SQL-Namensbezeichners.

SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME

DBTYPE_WSTR

Der Name eines XML-Schemas in der Schemaauflistung. Teil des dreiteiligen SQL-Namensbezeichners.

SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME

DBTYPE_WSTR

Der Name der XML-Schemaauflistung im Katalogteil A des dreiteiligen SQL-Namensbezeichners.

Die DBPROPSET_SQLSERVERCOLUMN-Eigenschaftengruppe

Um die Tabellenerstellung in der ITableDefinition-Schnittstelle zu unterstützen, fügt SQL Server Native Client der DBPROPSET_SQLSERVERCOLUMN-Eigenschaftengruppe drei neue Spalten hinzu.

Name

Typ

Beschreibung

SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME

VT_BSTR

Bei typisierten XML-Spalten ist diese Eigenschaft eine Zeichenfolge, die den Namen des Katalogs angibt, in dem das XML-Schema gespeichert ist. Für andere Spaltentypen gibt diese Eigenschaft eine leere Zeichenfolge zurück.

SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME

VT_BSTR

Bei typisierten XML-Spalten ist diese Eigenschaft eine Zeichenfolge, die den Namen des XML-Schemas angibt, das diese Spalte definiert.

SSPROP_COL_XML_SCHEMACOLLECTIONNAME

VT_BSTR

Bei typisierten XML-Spalten ist diese Eigenschaft eine Zeichenfolge, die den Namen der XML-Schemaauflistung angibt, die den Wert definiert.

Wie die SSPROP_PARAM-Werte sind all diese Eigenschaften optional und standardmäßig leer. SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME und SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME können nur angegeben werden, wenn SSPROP_COL_XML_SCHEMACOLLECTIONNAME angegeben ist. Bei der Übergabe von XML an den Server werden diese Werte (falls vorhanden) auf ihr Vorhandensein in der aktuellen Datenbank überprüft, und die Instanzdaten werden mit dem Schema verglichen. In jedem Fall müssen sie entweder alle leer oder alle ausgefüllt sein, um gültig zu sein.

Hinzufügungen und Änderungen an der OLE DB-Schnittstelle

SQL Server Native Client fügt neue Werte oder Änderungen in zahlreichen Core-OLE DB-Schnittstellen hinzu.

Die ISSCommandWithParameters-Schnittstelle

Um den xml-Datentyp durch OLE DB zu unterstützen, implementiert SQL Server Native Client eine Reihe von Änderungen, darunter die neue ISSCommandWithParameters-Schnittstelle. Diese neue Schnittstelle erbt von der OLE DB-Kernschnittstelle ICommandWithParameters. Zusätzlich zu den drei von ICommandWithParameters geerbten Methoden GetParameterInfo, MapParameterNames und SetParameterInfo stellt ISSCommandWithParameters zur Verarbeitung serverspezifischer Datentypen die Methoden GetParameterProperties und SetParameterProperties bereit.

HinweisHinweis

Die ISSCommandWithParameters-Schnittstelle nutzt auch die neue SSPARAMPROPS-Struktur.

Die IDBColumnsRowset-Schnittstelle

SQL Server Native Client fügt die folgenden SQL Server-spezifischen Spalten zu dem von der IColumnRowset::GetColumnsRowset-Methode zurückgegebenen Rowset hinzu. Diese Spalten enthalten den dreiteiligen Namen einer XML-Schemaauflistung. Für Nicht-XML-Spalten oder nicht typisierte XML-Spalten nehmen alle drei Spalten den Standardwert von NULL an.

Spaltenname

Typ

Beschreibung

DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME

DBTYPE_WSTR

Der Katalog, zu dem eine XML-Schemaauflistung gehört.

Andernfalls wird NULL verwendet.

DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME

DBTYPE_WSTR

Das Schema, zu dem eine XML-Schemaauflistung gehört. Andernfalls wird NULL verwendet.

DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME

DBTYPE_WSTR

Der Name einer XML-Schemaauflistung für typisierte XML-Spalten, andernfalls NULL.

Die IRowset-Schnittstelle

Eine XML-Instanz in einer XML-Spalte wird durch die IRowset::GetData-Methode abgerufen. Je nach Bindung, die vom Client angegeben ist, kann eine XML-Instanz als DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML, DBTYPE_STR, DBTYPE_BYTES oder als Schnittstelle über DBTYPE_IUNKNOWN abgerufen werden. Falls der Consumer DBTYPE_BSTR, DBTYPE_WSTR oder DBTYPE_VARIANT angibt, konvertiert der Anbieter die XML-Instanz in den vom Benutzer angeforderten Typ und legt ihn an dem in der zugehörigen Bindung angegebenen Speicherort ab.

Falls der Consumer DBTYPE_IUNKNOWN angibt und das pObject-Argument auf NULL oder das pObject-Argument auf IID_IsequentialStream setzt, gibt der Anbieter eine ISequentialStream-Schnittstelle an den Consumer zurück, damit er den XML-Datenstrom aus der Spalte übertragen kann. ISequentialStream gibt dann die XML-Daten als Unicode-Zeichendatenstrom zurück.

Wenn ein an DBTYPE_IUNKNOWN gebundener XML-Wert zurückgegeben wird, meldet der Anbieter einen Größenwert von sizeof (IUnknown *). Dies stimmt mit der Vorgehensweise für Spalten überein, die als DBTYPE_IUnknown oder DBTYPE_IDISPATCH gebunden sind, sowie für DBTYPE_IUNKNOWN/ISequentialStream, wenn die genaue Spaltengröße nicht bestimmt werden kann.

Die IRowsetChange-Schnittstelle

Es gibt zwei Methoden, wie ein Consumer eine XML-Instanz in einer Spalte aktualisieren kann. Die erste Methode erfolgt durch das vom Anbieter erstellte Speicherobjekt ISequentialStream. Der Consumer kann die ISequentialStream::Write-Methode aufrufen, um die vom Anbieter zurückgegebene XML-Instanz direkt zu aktualisieren.

Der zweite Ansatz ist die IRowsetChange::SetData-Methode oder IRowsetChange::InsertRow-Methode. Bei dieser Vorgehensweise kann eine XML-Instanz im Consumerpuffer in einer Bindung vom Typ DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML oder DBTYPE_IUNKNOWN angegeben werden.

Im Falle von DBTYPE_BSTR, DBTYPE_WSTR oder DBTYPE_VARIANT speichert der Anbieter die XML-Instanz, die sich im Consumerpuffer befindet, in der entsprechenden Spalte.

Bei Verwendung von DBTYPE_IUNKNOWN/IsequentialStream muss der Consumer, falls er kein Speicherobjekt angibt, vorher ein ISequentialStream-Objekt erstellen, das XML-Dokument an das Objekt binden und das Objekt anschließend mit der IRowsetChange::SetData-Methode an den Anbieter übergeben. Der Consumer kann auch ein Speicherobjekt erstellen, das pObject-Argument auf IID_ISequentialStream setzen, ein ISequentialStream-Objekt erstellen und anschließend das ISequentialStream-Objekt an die IRowsetChange::SetData-Methode übergeben. In beiden Fällen kann der Anbieter das XML-Objekt über das ISequentialStream-Objekt abrufen und es in die entsprechende Spalte einfügen.

Die IRowsetUpdate-Schnittstelle

Die IRowsetUpdate-Schnittstelle stellt die Funktionalität für verzögerte Updates bereit. Die Daten, die in den Rowsets zur Verfügung gestellt wurden, sind erst dann für andere Transaktionen verfügbar, wenn der Consumer die IRowsetUpdate:Update-Methode aufruft.

Die IRowsetFind-Schnittstelle

Die IRowsetFind::FindNextRow-Methode funktioniert nicht mit dem xml-Datentyp. Wenn IRowsetFind::FindNextRow aufgerufen wird und das hAccessor-Argument eine Spalte von DBTYPE_XML angibt, wird DB_E_BADBINDINFO zurückgegeben. Dies tritt unabhängig vom Typ der Spalte auf, die durchsucht wird. Für alle anderen Bindungstypen schlägt FindNextRow mit DB_E_BADCOMPAREOP fehl, wenn die zu durchsuchende Spalte vom Datentyp xml ist.

SQL Server Native Client-ODBC-Treiber

Im SQL Server Native Client-ODBC-Treiber wurde eine Reihe von Änderungen an verschiedenen Funktionen vorgenommen, um den xml-Datentyp zu unterstützen.

SQLColAttribute

Die SQLColAttribute-Funktion verfügt über drei neue Feldbezeichner: SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME und SQL_CA_SS _XML_SCHEMACOLLECTION_NAME.

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED für die SQL_DESC_DISPLAY_SIZE- und SQL_DESC_LENGTH-Spalten.

SQLColumns

Die SQLColumns-Funktion verfügt über drei neue Spalten: SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SS_XML_SCHEMACOLLECTION_SCHEMA_NAME und SS_XML_SCHEMACOLLECTION_NAME. Die vorhandene TYPE_NAME-Spalte dient zur Angabe des Namens des XML-Typs, und DATA_TYPE für eine Spalte oder einen Parameter vom XML-Typ ist SQL_SS_XML.

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED für die COLUMN_SIZE- und CHAR_OCTET_LENGTH-Werte.

SQLDescribeCol

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED, wenn die Spaltengröße nicht in der SQLDescribeCol-Funktion bestimmt werden kann.

SQLGetTypeInfo

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED als Maximum für COLUMN_SIZE für den xml-Datentyp in der SQLGetTypeInfo-Funktion.

SQLProcedureColumns

Die SQLProcedureColumns-Funktion hat die gleichen zusätzlichen Spalten wie die SQLColumns-Funktion.

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED als Maximum für COLUMN_SIZE für den xml-Datentyp.

Unterstützte Umwandlungen

Bei der Umwandlung von SQL- in C-Datentypen können SQL_C_WCHAR, SQL_C_BINARY und SQL_C_CHAR unter folgenden Bedingungen in SQL_SS_XML umgewandelt werden:

  • SQL_C_WCHAR: Format ist UTF-16, keine Bytereihenfolge-Marke (BOM), mit NULL-Terminierung.

  • SQL_C_BINARY: Format ist UTF-16, ohne NULL-Terminierung. Den vom Server empfangenen Daten wird immer eine BOM hinzugefügt. Wenn eine leere Zeichenfolge vom Server zurückgegeben wird, wird trotzdem eine BOM an die Anwendung zurückgegeben. Wenn die Pufferlänge eine ungerade Anzahl von Bytes ist, werden die Daten ordnungsgemäß abgeschnitten. Wenn der ganze Wert in Abschnitten zurückgegeben wird, können diese verkettet werden, um wieder den richtigen Wert zusammenzusetzen.

  • SQL_C_CHAR: Format enthält Mehrbytezeichen, die in der Clientcodepage mit NULL-Terminierung codiert sind. Konvertierung aus vom Server bereitgestelltem UTF-16 verursacht möglicherweise Datenbeschädigung, daher wird diese Bindung nicht empfohlen.

Bei der Umwandlung von C- in SQL-Datentypen können SQL_C_WCHAR, SQL_C_BINARY und SQL_C_CHAR unter folgenden Bedingungen in SQL_SS_XML umgewandelt werden:

  • SQL_C_WCHAR: Den an den Server gesendeten Daten wird immer eine BOM hinzugefügt. Falls die Daten bereits mit einer BOM begonnen haben, stehen dann zwei BOMs am Beginn des Puffers. Der Server verwendet die erste BOM, um die Codierung als UTF-16 zu erkennen, und verwirft sie dann. Die zweite BOM wird als geschütztes Leerzeichenzeichen mit Nullbreite interpretiert.

  • SQL_C_BINARY: Es wird keine Konvertierung ausgeführt, und die Daten werden unverändert an den Server übergeben. UTF-16-Daten müssen mit einer BOM starten. Wenn nicht, wird die Codierung möglicherweise nicht ordnungsgemäß vom Server erkannt.

  • SQL_C_CHAR: Die Daten werden auf dem Client in UTF-16 konvertiert und als SQL_C_WCHAR an den Server gesendet (einschließlich der hinzugefügten BOM). Wenn XML nicht in der Clientcodepage codiert ist, kann dies zu Datenbeschädigungen führen.

Der XML-Standard erfordert, dass UTF-16-codiertes XML mit einer Bytereihenfolge-Marke (BOM), UTF-16-Zeichencode 0xFEFF beginnt. Wenn Sie mit SQL_C_BINARY-Bindungen arbeiten, benötigt SQL Server Native Client keine BOM, da die Codierung durch die Bindung impliziert ist. Das Hauptaugenmerk liegt auf der einfachen Zusammenarbeit mit anderen XML-Prozessoren und Speichersystemen. In diesem Fall sollte für UTF-16-codiertes XML eine BOM vorhanden sein, und die Anwendung sollte sich nicht um die eigentliche Codierung kümmern, da die Mehrheit der XML-Prozessoren (einschließlich SQL Server) die Codierung nach Überprüfen des ersten Bytes des Wertes ableitet. XML-Daten, die von SQL Server Native Client unter Verwendung von SQL_C_BINARY-Bindungen empfangen werden, sind immer in UTF-16 mit einer BOM und ohne eingebettete Codierdeklaration codiert.

Siehe auch

Verweis

ISSCommandWithParameters (OLE DB)

Andere Ressourcen

SQL Server Native Client-Funktionen