Share via


Verbessertes Verhalten des Datums- und Uhrzeittyps bei früheren Versionen von SQL Server (ODBC)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

In diesem Thema wird das erwartete Verhalten beschrieben, wenn eine Clientanwendung, die erweiterte Datums- und Uhrzeitfeatures verwendet, mit einer Version von SQL Server vor SQL Server 2008 (10.0.x) kommuniziert und eine Clientanwendung mit Microsoft Data Access-Komponenten, Windows-Datenzugriffskomponenten oder einer Version von SQL Server Native Client früher als SQL Server 2008 (10.0.x) sendet Befehle an einen Server, der erweiterte Datums- und Uhrzeitfeatures unterstützt.

Downlevelclient-Verhalten

Clientanwendungen, die mit einer Version von SQL Server Native Client vor SQL Server 2008 (10.0.x) kompiliert wurden, sehen die neuen Datums-/Uhrzeittypen als nvarchar-Spalten. Die Spalteninhalte sind die Literaldarstellungen, wie im Abschnitt "Datenformate: Zeichenfolgen und Literale" unter Datentypunterstützung für ODBC-Datums- und Uhrzeitverbesserungen 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 Typname SQL Server 2008 (10.0.x).

Die von SQLDescribeCol, SQLDescribeParam, SQGetDescField und SQLColAttribute zurückgegebenen Anweisungsmetadaten geben Metadaten zurück, die in jeder Hinsicht mit dem typbasierten Typ konsistent sind, einschließlich des Typnamens. Ein Beispiel für einen solchen Down-Level-Typ ist nvarchar.

Wenn eine Clientanwendung auf down-Level für einen SQL Server 2008 (10.0.x) (oder höher) Server ausgeführt wird, auf dem Schemaänderungen an Datums-/Uhrzeittypen vorgenommen wurden, wird folgendes Verhalten erwartet:

SQL Server 2005-Typ SQL Server Typ 2008 (10.0.x) (oder höher) 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. Funktioniert mit SQL Server 2005 (9.x).
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 sind. Funktioniert mit SQL Server 2005 (9.x).
Time(7) SQL_C_TIME Fehler: Ungültiger Zeitliteral. OK (1)
SQL_C_TYPE_TIMESTAMP Fehler: Ungültiger 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. Funktioniert mit SQL Server 2005 (9.x).
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.

Funktioniert mit SQL Server 2005 (9.x).
Datetime2(0) SQL_C_TYPE_TIMESTAMP OK OK

Aufschlüsselung der Symbole

Symbol Bedeutung
1 Wenn es mit SQL Server 2005 (9.x) funktioniert hat, sollte es weiterhin mit einer neueren Version von SQL Server funktionieren.
2 Eine Anwendung, die mit SQL Server 2005 (9.x) funktionierte, 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 date/time-Typen 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 date/time-Typen 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 eine Verbindung mit einem Server instance einer früheren Version hergestellt wird, die 2008 (10.0.x) SQL Server, führt jeder Versuch, die neuen Servertypen oder zugeordneten Metadatencodes und Deskriptorfelder zu verwenden, dazu, dass SQL_ERROR zurückgegeben wird. 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.

Weitere Informationen

Verbesserungen bei Datum und Zeit (ODBC)