Datentypzuordnung mit verteilten Abfragen

Ein OLE DB-Anbieter stellt die Datentypen seiner Daten entsprechend den OLE DB-Typenbezeichnern namens DBTYPEs dar. Datentypen werden zwischen OLE DB-Datentypen und SQL Server-Systemdatentypen durch Zuordnen von Daten konvertiert:

  • OLE DB-Datentypen werden SQL Server-Systemdatentypen zugeordnet. Diese Konvertierung erfolgt, wenn SQL Server Daten aus der OLE DB-Datenquelle liest, entweder in SELECT-Anweisungen oder beim Lesevorgang in UPDATE-, INSERT- oder DELETE-Anweisungen.

  • SQL Server-Systemdatentypen werden OLE DB-Datentypen zugeordnet. Diese Konvertierung erfolgt, wenn SQL Server, meist in INSERT- oder UPDATE-Anweisungen, Daten in die OLE DB-Datenquelle schreibt, in der die geänderte Tabelle als Remotetabelle vorliegt.

Datentypzuordnung vom OLE DB-Anbieter zu SQL Server

Die Datentypzuordnung vom OLE DB-Anbieter zu SQL Server definiert die zulässigen Vergleiche und Ausdrücke sowie die gültigen expliziten Konvertierungen, die Remotedaten betreffen. Die Zuordnung wird in der folgenden Tabelle gezeigt.

Die Typgültigkeit für Remotetabellenspalten in Ausdrücken lässt sich durch folgende Regel zusammenfassen: Ein Remotespaltenwert ist in einem Transact-SQL-Ausdruck zulässig, wenn der entsprechende zugeordnete SQL Server-Datentyp in der Datentyp-Zuordnungstabelle im gleichen Kontext zulässig ist.

Angenommen, der folgende Ausdruck liegt vor: local_columnOPERATOR remote_column. In diesem Ausdruck ist local_column eine lokale Tabellenspalte, und remote_column ist eine Remotetabellenspalte. Dieser Ausdruck ist gültig, wenn OPERATOR ein gültiger Operator für den Datentyp der lokalen Spalte und für den Datentyp ist, dem DBTYPE von remote_column zugeordnet wird.

Ebenso ist CAST(remote_columnASdata_type_1) zulässig, wenn DBTYPE von remote_column dem SQL Server-Systemdatentyp data_type_2 zugeordnet wird und explizite Konvertierung von data_type_2 in data_type_1 zulässig ist. Eine Spalte des Datentyps DBTYPE_DATE auf der Anbieterseite kann z. B. in eine datetime-Spalte in SQL Server konvertiert werden. Die DBTYPE_DATE-Daten können jedoch nicht direkt in varchar konvertiert werden.

Die folgende Tabelle zeigt die Datentyp-Zuordnungstabelle. Mithilfe des DBTYPE-Indikators und seines DBCOLUMNFLAGS-Wertes einer Spalte können Sie den entsprechenden SQL Server-Datentyp ermitteln.

DBTYPE

DBCOLUMNFLAGS

SQL Server-Datentyp

DBTYPE_I1

numeric(3, 0)1

DBTYPE_I2

smallint

DBTYPE_I4

int

DBTYPE_I8

bigint

DBTYPE_UI1

tinyint

DBTYPE_UI1

numeric(5,0)

DBTYPE_UI1

numeric(10,0)

DBTYPE_UI1

numeric(20,0)

DBTYPE_R4

float

DBTYPE_R8

real

DBTYPE_NUMERIC

numeric

DBTYPE_DECIMAL

decimal

DBTYPE_CY

money

DBTYPE_BSTR

DBCOLUMNFLAGS_ISLONG = TRUE

ntext

DBTYPE_BSTR

DBCOLUMNFLAGS_ISFIXEDLENGTH = TRUE

nchar

DBTYPE_BSTR

DBCOLUMNFLAGS_ISFIXEDLENGTH = FALSE

nvarchar

DBTYPE_IDISPATCH

Fehler

DBTYPE_ERROR

Fehler

DBTYPE_BOOL

bit

DBTYPE_VARIANT

nvarchar(4000)

DBTYPE_IUNKNOWN

Fehler

DBTYPE_GUID

uniqueidentifier

DBTYPE_BYTES

DBCOLUMNFLAGS_ISLONG = true oder maximale Spaltenlänge > 8.000 Byte

image

DBTYPE_BYTES

DBCOLUMNFLAGS_ISLONG = true und unbegrenzte Spaltenlänge

varbinary(max)

DBTYPE_BYTES

DBCOLUMNFLAGS_ISROWVER = true, DBCOLUMNFLAGS_ISFIXEDLENGTH = true und Spaltenlänge = 8

timestamp

DBTYPE_BYTES

DBCOLUMNFLAGS_ISFIXEDLENGTH = TRUE

binary

DBTYPE_BYTES

DBCOLUMNFLAGS_ISFIXEDLENGTH = FALSE

varbinary

DBTYPE_STR

DBCOLUMNFLAGS_ISFIXEDLENGTH = TRUE

char

DBTYPE_ STR

DBCOLUMNFLAGS_ISFIXEDLENGTH = FALSE

varchar

DBTYPE_STR

DBCOLUMNFLAGS_ISLONG = true oder maximale Spaltenlänge > 8.000 Zeichen.

text

DBTYPE_STR

DBCOLUMNFLAGS_ISLONG = true und unbegrenzte Spaltenlänge

varchar(max)

DBTYPE_WSTR

DBCOLUMNFLAGS_ISFIXED

nchar

DBTYPE_WSTR

DBCOLUMNFLAGS_ISFIXEDLENGTH = FALSE

nvarchar

DBTYPE_WSTR

DBCOLUMNFLAGS_ISLONG = true oder maximale Spaltenlänge > 4.000 Zeichen.

ntext

DBTYPE_WSTR

DBCOLUMNFLAGS_ISLONG = true und unbegrenzte Spaltenlänge

nvarchar(max)

DBTYPE_UDT

Äquivalenter benutzerdefinierter SQL Server-Typ, wenn ein solcher registriert ist.

DBTYPE_DATE

date, datetime, datetime2, datetimeoffset

DBTYPE_DBDATE

date, datetime, datetime2, datetimeoffset (Kompatibilitätsgrad ist kleiner als 9,0)

DBTYPE_DBTIME

time, datetime, datetime2, datetimeoffset

DBTYPE_DBTIME_EX

time, datetime2, datetimeoffset

DBTYPE_DBTIMESTAMP

time, date, datetime2, datetimeoffset, datetime

DBTYPE_DBTIMESTAMP

time, date, datetime2, datetimeoffset

DBTYPE_DBTIMESTAMP

time, date, datetime2, datetimeoffset

DBTYPE_ARRAY

Fehler

DBTYPE_BYREF

Wird ignoriert.

DBTYPE_VECTOR

Fehler

DBTYPE_RESERVED

Fehler

DBTYPE_XML

xml (Nur in Pass-Through-Abfragen zulässig.)

1numeric(p,s) gibt den SQL Server-Datentyp numeric mit Genauigkeit p und s Dezimalstellen an.

HinweisHinweis

Wenn die Daten in einen SQL Server-Datentyp konvertiert werden müssen, der sich vom gezeigten Standarddatentyp unterscheidet, ist eine explizite Konvertierung mithilfe der CAST- oder CONVERT-Funktion erforderlich. Weitere Informationen finden Sie unter CAST und CONVERT (Transact-SQL).

Die DBTYPE-Indikator- und DBCOLUMNFLAGS-Wertinformationen stammen über das COLUMNS-Schemarowset oder die IColumnsInfo-Schnittstelle vom Anbieter. Im Fall des COLUMNS-Schemarowsets stellen die DATA_TYPE- und die COLUMN_FLAGS-Spalte die DBTYPE- und DBCOLUMNFLAGS-Werte dar. Im Fall der IColumnsInfo::GetColumnInfo-Schnittstelle stellen die wType- und dwFlags-Elemente der DBCOLUMNINFO-Struktur diese Werte dar.

Datentypzuordnung von SQL Server zum OLE DB-Anbieter

SQL Server-Systemdatentypen werden OLE DB-Datentypen mithilfe der in der vorherigen Tabelle gezeigten Zuordnung zugeordnet. Die Zuordnung eines SQL Server-Typs S1 zu einem OLE DB-Typ T ist zulässig, wenn eine der folgenden Bedingungen gegeben ist:

  • Die entsprechende Zuordnung ist in der Datentyp-Zuordnungstabelle aufgeführt.

  • Es wird eine zulässige, implizite Konvertierung des Datentyps S1 in einen anderen SQL Server-Datentyp S2 durchgeführt, und die Zuordnung von S2 zu T ist in der Datentyp-Zuordnungstabelle definiert.

SQL Server 2008-Zuordnung der von einem Remoteserver empfangenen Datums- und Uhrzeitangaben

In der folgenden Tabelle wird die Datentypzuordnung zwischen date und time für Daten gezeigt, die von einer OLE DB-Datenquelle an eine Instanz von SQL Server 2008 gesendet werden. Diese Konvertierung erfolgt, wenn SQL Server 2008 Daten aus der OLE DB-Datenquelle liest, entweder in SELECT-Anweisungen oder beim Lesevorgang in UPDATE-, INSERT- oder DELETE-Anweisungen. Wenn eine Remotespalte vom Datentyp date, time, dateime2 oder datetimeoffset ist, dann wird der Typ zurückgegeben, wenn der Kompatibilitätsgrad der Datenbank 100 oder höher ist. Wenn der Kompatibilitätsgrad niedriger ist, führt SQL Server 2008 eine implizite Konvertierung zu datetime durch.

OLE DB-Typ

Wenn der Remoteserver SQL Server 2008 ist,

Folgendes zurückgeben:

Wenn der Remoteserver SQL Server 2005 oder SQL Server 2000 ist, Folgendes zurückgeben:

Wenn der Remoteserver kein SQL Server und der Kompatibilitätsgrad der lokalen SQL Server 2008-Datenbank gleich 90 ist, Folgendes zurückgeben:

Wenn der Remoteserver kein SQL Server und der Kompatibilitätsgrad der lokalen SQL Server 2008-Datenbank gleich 100 ist, Folgendes zurückgeben:

DBTYPE_DBTIMESTAMP ohne dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

datetime (Remotespalte könnte datetime oder smalldatetime sein)

datetime (Remotespalte könnte datetime oder smalldatetime sein)

datetime

datetime2(7)

DBTYPE_DBTIMESTAMP mit dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

datetime2

Nicht zutreffend

Nicht zutreffend

Nicht zutreffend

DBTYPE_DBDATE

date

Nicht zutreffend

datetime

date

DBTYPE_DBTIME

time(0)

Nicht zutreffend

datetime

time(0)

DBTYPE_DBTIME2

time(n)

Nicht zutreffend

Nicht zutreffend

Nicht zutreffend

DBTYPE_DBTIMESTAMPOFFSET

datetimeoffset

Nicht zutreffend

Nicht zutreffend

Nicht zutreffend

SQL Server 2008-Zuordnung der an einen Remoteserver gesendeten Datums- und Uhrzeitangaben

In der folgenden Tabelle wird die Datentypzuordnung zwischen date und time für Daten gezeigt, die von einer Instanz von SQL Server 2008 an ein OLE DB-Datenziel gesendet werden. Diese Konvertierung erfolgt, wenn SQL Server 2008, meist in INSERT- oder UPDATE-Anweisungen, Daten in die OLE DB-Datenquelle schreibt, in der die geänderte Tabelle als Remotetabelle vorliegt.

SQL Server 2008-Datentyp

Wenn der Remoteserver SQL Server 2008 ist,

binden an:

Wenn der Remoteserver SQL Server 2005 oder SQL Server 2000 ist, binden an:

Wenn der Remoteserver kein SQL Server 2008 ist, binden an:

datetime, smalldatetime

DBTYPE_DBTIMESTAMP ohne dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

DBTYPE_DBTIMESTAMP ohne dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

DBTYPE_DBTIMESTAMP ohne dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

datetime2(n)

DBTYPE_DBTIMESTAMP mit dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

DBTYPE_DBTIMESTAMP ohne dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

DBTYPE_DBTIMESTAMP ohne dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

date

DBTYPE_DBDATE

DBTYPE_DBDATE

DBTYPE_DBDATE

time(0)

DBTYPE_DBTIME

DBTYPE_DBTIME

DBTYPE_DBTIME

time(n) (0 < n <= 7)

DBTYPE_DBTIMESTAMP (mit ausstehendem Datumsteil)

mit dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

DBTYPE_DBTIMESTAMP ohne dwFlags, der als DBPARAMFLAGS_SS_ISVARIABLESCALE festgelegt wird

DBTYPE_DBTIMESTAMP (mit ausstehendem Datumsteil)

datetimeoffset

DBTYPE_DBTIMESTAMPOFFSET

Nicht zutreffend

Nicht zutreffend

SQL Server 2008-Remoteabfrageausführung mit Datums- und Uhrzeitdatentypen

SQL Server 2008 führt Abfragen, die auf Remoteobjekte des Datentyps time, date, datetime2 oder datetimoffset verweisen, entweder auf dem lokalen Server oder auf dem Remoteserver aus. Die Entscheidung hängt von der Version oder dem Anbieter des Remoteservers und dem Typ des Verweises ab. Betrachtet werden die Verweistypen Remotespalte oder eine konstante, variable oder lokale Spalte.

Nicht-SQL Server-Anbieter

Die Datentypen time, date und datetime2 werden teilweise unterstützt, wenn auf dem Remoteserver ähnliche Typen für Nicht-SQL Server-Anbieter vorhanden sind. Diese Anbieter haben keine Möglichkeit, ihre Unterstützung für diese Typen zu deklarieren.

Die folgende Tabelle zeigt, ob eine Abfrage auf dem Remoteserver oder dem lokalen Server ausgeführt wird. Die ersten Spalten zeigen den Datentyp auf dem lokalen Server. Die zweite Spalte enthält den entsprechenden OLE DB-Datentyp, den die lokale Instanz von SQL Server 2008 für den Remoteserver verwendet. Die letzten drei Spalten Tabelle zeigen, ob die Abfrage auf dem Remoteserver oder dem lokalen Server ausgeführt wird. Der Ausführungsort hängt von der Version oder dem Typ des Remoteservers ab.

Datentyp auf dem lokalen Server

Remoteserver-OLE DB-Datentyp, der vom lokalen SQL Server 2008 verwendet wird

SQL Server 2008 oder eine höhere Version als Remoteserver

SQL Server 2005 als Remoteserver

Nicht-MSSQL-Remoteserver

datetime

DBTYPE_DBTIMESTAMP

Remote

Remote

Remote

smalldatetime

DBTYPE_DBTIMESTAMP

Remote

Remote

Remote

datetime2

DBTYPE_DBTIMESTAMP

Remote

Lokal

Remote

datetimeoffset

DBTYPE_DBTIMESTAMPOFFSET

Remote

Lokal

Lokal

date

DBTYPE_DBDATE

Remote

Lokal

Remote

time(>0)

DBTYPE_DBTIME2

Remote

Lokal

Lokal

time(0)

DBTYPE_DBTIME2

Remote

Lokal

Remote