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.
Hinweis |
---|
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 |
Siehe auch