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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für