Verbessertes Verhalten des Datums- und Uhrzeittyps bei früheren Versionen von SQL Server (ODBC)
In diesem Thema wird das erwartete Verhalten beschrieben, wenn eine Clientanwendung, die verbesserte Datums- und Uhrzeitfunktionen verwendet, mit einer Version von SQL Server vor SQL Server 2008 kommuniziert und wenn eine Clientanwendung, die Microsoft Data Access Components, Windows Data Access Components oder eine Version von SQL Server Native Client vor SQL Server 2008 verwendet, Befehle an einen Server sendet, der verbesserte Datums- und Uhrzeitfunktionen unterstützt.
Downlevelclient-Verhalten
Clientanwendungen, die mit einer SQL Server Native Client-Version vor SQL Server 2008 kompiliert wurden, erkennen die neuen Datums-/Uhrzeittypen als nvarchar-Spalten. Der Spalteninhalt entspricht der literalen Darstellung wie im Abschnitt "Datenformate: Zeichenfolgen und Literale" unter Datentypunterstützung für ODBC-Verbesserungen bei Datum/Uhrzeit beschrieben. Die Spaltengröße ist die maximale literale Länge mit der für die Spalte angegebenen Genauigkeit in Bruchteilen von Sekunden.
Katalog-APIs geben Metadaten zurück, die mit dem an den Client zurückgegebenen Datentypcode früherer Versionen (z. B. nvarchar) und der zugeordneten Darstellung früherer Versionen (z. B. das entsprechende literale Format) übereinstimmt. Der zurückgegebene Datentypname ist jedoch der echte SQL Server 2008-Typname.
Von SQLDescribeCol, SQLDescribeParam, SQGetDescField und SQLColAttribute zurückgegebene Anweisungsmetadaten geben Metadaten zurück, die mit dem Downleveltyp in jeder Hinsicht, so auch mit dem Typnamen, übereinstimmen. nvarchar ist ein Beispiel für einen Downleveltyp dieser Art.
Wenn eine Downlevelclientanwendung auf einem SQL Server 2008-Server (oder höher) ausgeführt wird, an dem Schemaänderungen an Datums-/Uhrzeittypen vorgenommen wurden, sieht das zu erwartende Verhalten wie folgt aus:
SQL Server 2005-Typ |
SQL Server 2008 (oder höher) - Typ |
ODBC-Clienttyp |
Ergebniskonvertierung (SQL zu C) |
Parameterkonvertierung (C zu SQL) |
---|---|---|---|---|
Datetime |
Date |
SQL_C_TYPE_DATE |
OK |
OK (1) |
SQL_C_TYPE_TIMESTAMP |
Zeitfelder werden auf 0 (Null) festgelegt. |
OK (2) Fehler, wenn das Zeitfeld ungleich 0 (null) ist. Verwendet SQL Server 2005. |
||
Time(0) |
SQL_C_TYPE_TIME |
OK |
OK (1) |
|
SQL_C_TYPE_TIMESTAMP |
Datumsfelder werden auf das aktuelle Datum festgelegt. |
OK (2) Datum wird ignoriert. Fehler, wenn Sekundenbruchteile ungleich 0 (null) sind. Verwendet SQL Server 2005. |
||
Time(7) |
SQL_C_TIME |
Fehler. Ungültiges Zeitliteral. |
OK (1) |
|
SQL_C_TYPE_TIMESTAMP |
Fehler. Ungültiges Zeitliteral. |
OK (1) |
||
Datetime2(3) |
SQL_C_TYPE_TIMESTAMP |
OK |
OK (1) |
|
Datetime2(7) |
SQL_C_TYPE_TIMESTAMP |
OK |
Wert wird von Clientkonvertierung auf 1/300stel Sekunde gerundet. |
|
Smalldatetime |
Date |
SQL_C_TYPE_DATE |
OK |
OK |
SQL_C_TYPE_TIMESTAMP |
Zeitfelder werden auf 0 (Null) festgelegt. |
OK (2) Fehler, wenn das Zeitfeld ungleich 0 (null) ist. Verwendet SQL Server 2005. |
||
Time(0) |
SQL_C_TYPE_TIME |
OK |
OK |
|
SQL_C_TYPE_TIMESTAMP |
Datumsfelder werden auf das aktuelle Datum festgelegt. |
OK (2) Datum wird ignoriert. Fehler, wenn Sekundenbruchteile ungleich 0 (null) sind. Verwendet SQL Server 2005. |
||
Datetime2(0) |
SQL_C_TYPE_TIMESTAMP |
OK |
OK |
Aufschlüsselung der Symbole
Symbol |
Bedeutung |
---|---|
1 |
Wenn es mit SQL Server 2005 funktioniert hat, sollte es auch mit einer neueren Version von SQL Server funktionieren. |
2 |
Eine Anwendung, die mit SQL Server 2005 funktiniert hat, kann mit einer neueren Version von SQL Server fehlschlagen. |
Nur allgemeine Schemaänderungen wurden berücksichtigt. Dabei handelt es sich um die folgenden allgemeinen Änderungen:
Verwenden eines neuen Typs, wenn eine Anwendung logisch nur einen Datums- oder Zeitwert erfordert. Die Anwendung musste jedoch datetime oder smalldatetime verwenden, da keine separaten Datums- und Zeittypen verfügbar waren.
Verwenden eines neuen Typs, um zusätzliche Genauigkeit in Sekundenbruchteilen zu erzielen.
Wechseln zu datetime2, da dies der bevorzugte Datentyp für Datum und Uhrzeit ist.
Von 'SQLColumns', 'SQLProcedureColumns' und 'SWLSpecialColumns' zurückgegebene Spaltenmetadaten
Die folgenden Spaltenwerte werden für Datums-/Uhrzeittypen zurückgegeben:
Spaltentyp |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
---|---|---|---|---|---|---|
DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_TYPE_TIMESTAMP |
SQL_TYPE_TIMESTAMP |
SQL_WVARCHAR |
SQL_WVARCHAR |
TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
COLUMN_SIZE |
10 |
8,10..16 |
16 |
23 |
19, 21..27 |
26, 28..34 |
BUFFER_LENGTH |
20 |
16, 20..32 |
16 |
16 |
38, 42..54 |
52, 56..68 |
DECIMAL_DIGITS |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
SQL_DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME |
SQL_DATETIME |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME_SUB |
NULL |
NULL |
SQL_CODE_TIMESTAMP |
SQL_CODE_TIMESTAMP |
NULL |
NULL |
CHAR_OCTET_LENGTH |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
SS_DATA_TYPE |
0 |
0 |
111 |
111 |
0 |
0 |
SQLSpecialColumns gibt weder SQL_DATA_TYPE noch SQL_DATETIME_SUB, CHAR_OCTET_LENGTH oder SS_DATA_TYPE zurück.
Von 'SQLGetTypeInfo' zurückgegebene Datentypmetadaten
Die folgenden Spaltenwerte werden für Datums-/Uhrzeittypen zurückgegeben:
Spaltentyp |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_TYPE_TIMESTAMP |
SQL_TYPE_TIMESTAMP |
SQL_WVARCHAR |
SQL_WVARCHAR |
COLUMN_SIZE |
10 |
16 |
16 |
23 |
27 |
34 |
LITERAL_PREFIX |
‘ |
‘ |
‘ |
‘ |
‘ |
‘ |
LITERAL_SUFFIX |
‘ |
‘ |
‘ |
‘ |
‘ |
‘ |
CREATE_PARAMS |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
CASE_SENSITIVE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
UNSIGNED_ATTRIBUTE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
FXED_PREC_SCALE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
AUTO_UNIQUE_VALUE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
LOCAL_TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
MINIMUM_SCALE |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
MAXIMUM_SCALE |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
SQL_DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME |
SQL_DATETIME |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME_SUB |
NULL |
NULL |
SQL_CODE_TIMESTAMP |
SQL_CODE_TIMESTAMP |
NULL |
NULL |
NUM_PREC_RADIX |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
INTERVAL_PRECISION |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
USERTYPE |
0 |
0 |
12 |
22 |
0 |
0 |
Downlevelserver-Verhalten
Wenn bei der Verbindung mit einer Serverinstanz einer früheren Version von SQL Server 2008 die neuen Servertypen oder zugehörige Metadatencodes und Deskriptorfelder verwendet werden, wird ein SQL_ERROR zurückgegeben. Es wird ein Diagnosedatensatz mit SQLSTATE HY004 und der Meldung "Ungültiger SQL-Datentyp für Serverversion in Verbindung" oder mit 07006 und der Meldung "Attributverletzung beschränkter Datentypen" zurückgegeben.