Neue Funktionen für Datum und Uhrzeit bei früheren SQL Server-Versionen (OLE DB)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics 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 ein Client, der mit einer Version von SQL Server Native Client vor SQL Server 2008 (10.0.x) kompiliert wurde, Befehle an einen Server sendet, der erweiterte Datums- und Uhrzeitfeatures unterstützt.
Downlevelclient-Verhalten
Clientanwendungen, die eine Version von SQL Server Native Client vor SQL Server 2008 (10.0.x) verwenden, sehen die neuen Datums-/Uhrzeittypen als nvarchar-Spalten . Die Spalten enthalten literale Darstellungen. Weitere Informationen finden Sie im Abschnitt "Datenformate: Zeichenfolgen und Literale" der Datentypunterstützung für OLE DB-Datums- und Uhrzeitverbesserungen. Die Spaltengröße ist die maximale Literallänge für die Genauigkeit, die für die Spalte festgelegt wurde.
Katalog-APIs geben Metadaten zurück, die mit dem auf der down-level-Ebene-Datentypcode übereinstimmen, der an den Client zurückgegeben wird (z . B. nvarchar) und die zugeordnete Darstellung auf Down-Level (z. B. das entsprechende Literalformat). Der zurückgegebene Datentypname ist jedoch der echte SQL Server 2008 (10.0.x)-Typname.
Wenn eine Clientanwendung auf unterer Ebene mit einem SQL Server 2008 (10.0.x) (oder höher) ausgeführt wird, auf dem Schemaänderungen an Datums-/Uhrzeittypen vorgenommen wurden, lautet das erwartete Verhalten wie folgt:
OLE DB-Clienttyp | SQL Server 2005-Typ | SQL Server 2008 (oder höher) Typ | Ergebniskonvertierung (Server zu Client) | Parameterkonvertierung (Client zu Server) |
---|---|---|---|---|
DBTYPE_DBDATE | Datetime | Datum | OK | OK |
DBTYPE_DBTIMESTAMP | Zeitfelder werden auf 0 (Null) festgelegt. | IRowsetChange schlägt aufgrund des Zeichenfolgenabschneidens fehl, wenn das Zeitfeld ungleich Null ist. | ||
DBTYPE_DBTIME | Time(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Datumsfelder werden auf das aktuelle Datum festgelegt. | IRowsetChange schlägt aufgrund des Zeichenfolgenabbruchs fehl, wenn Bruch sekunden ungleich Null sind. Das Datum wird ignoriert. |
||
DBTYPE_DBTIME | Time(7) | Fehler - ungültiges Zeitliteral. | OK | |
DBTYPE_DBTIMESTAMP | Fehler - ungültiges Zeitliteral. | OK | ||
DBTYPE_DBTIMESTAMP | Datetime2(3) | OK | OK | |
DBTYPE_DBTIMESTAMP | Datetime2(7) | OK | OK | |
DBTYPE_DBDATE | Smalldatetime | Datum | OK | OK |
DBTYPE_DBTIMESTAMP | Zeitfelder werden auf 0 (Null) festgelegt. | IRowsetChange schlägt aufgrund des Zeichenfolgenabschneidens fehl, wenn das Zeitfeld ungleich Null ist. | ||
DBTYPE_DBTIME | Time(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Datumsfelder werden auf das aktuelle Datum festgelegt. | IRowsetChange schlägt aufgrund des Zeichenfolgenabbruchs fehl, wenn Bruch sekunden ungleich Null sind. Das Datum wird ignoriert. |
||
DBTYPE_DBTIMESTAMP | Datetime2(0) | OK | OK |
OK bedeutet, dass, wenn es mit SQL Server 2005 (9.x) funktioniert hat, weiterhin mit SQL Server 2008 (10.0.x) (oder höher) arbeiten sollte.
Nur die folgenden allgemeinen Schemaänderungen wurden berücksichtigt:
Verwenden eines neuen Typs, wenn eine Anwendung logisch nur einen Datums- oder Zeitwert erfordert. Die Anwendung wurde jedoch gezwungen, "datetime" oder "smalldatetime" zu verwenden, da separate Datums- und Uhrzeittypen nicht 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.
Anwendungen, die Servermetadaten verwenden, die über ICommandWithParameters::GetParameterInfo oder Schema-Rowsets abgerufen werden, um Parametertypinformationen über ICommandWithParameters::SetParameterInfo festzulegen, treten während Clientkonvertierungen fehl, bei denen die Zeichenfolgendarstellung eines Quelltyps größer als die Zeichenfolgendarstellung des Zieltyps ist. Wenn beispielsweise eine Clientbindung DBTYPE_DBTIMESTAMP verwendet und die Serverspalte datum ist, konvertiert SQL Server Native Client den Wert in "yyyyy-dd-mm hh:mm:ss.fff", aber Servermetadaten werden als nvarchar(10) zurückgegeben. Der resultierende Überlauf löst DBSTATUS_E_CATCONVERTVALUE aus. Ähnliche Probleme treten bei Datenkonvertierungen von IRowsetChange auf, da die Rowset-Metadaten aus den Resultsetmetadaten festgelegt werden.
Metadaten für Parameter und Rowsets
In diesem Abschnitt werden Metadaten für Parameter, Ergebnisspalten und Schemazeilen für Clients beschrieben, die mit einer Version von SQL Server Native Client vor SQL Server 2008 (10.0.x) kompiliert werden.
ICommandWithParameters::GetParameterInfo
Die DBPARAMINFO-Struktur gibt die folgenden Informationen über den prgParamInfo-Parameter zurück:
Parametertyp | wType | ulParamSize | bPrecision | bScale |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | ~0 | ~0 |
time | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datetime | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | ~0 | ~0 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | ~0 | ~0 |
Beachten Sie, dass einige dieser Wertbereiche nicht fortlaufend sind; z. B. fehlt 9 in 8,10..16. Der Grund dafür ist das Hinzufügen eines Dezimaltrennzeichens, wenn die Genauigkeit von Bruchteilen größer als 0 (NULL) ist.
IColumnsRowset::GetColumnsRowset
Folgende Spalten werden zurückgegeben:
Spaltentyp | DBCOLUMN_TYPE | DBCOLUMN_COLUMNSIZE | DBCOLUMN_PRECISION | DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | NULL | NULL |
time | DBTYPE_WSTR | 8, 10..16 | NULL | NULL |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datetime | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | NULL | NULL |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | NULL | NULL |
ColumnsInfo::GetColumnInfo
Die DBCOLUMNINFO-Struktur gibt die folgenden Informationen zurück:
Parametertyp | wType | ulColumnSize | bPrecision | bScale |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | ~0 | ~0 |
time(1..7) | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datetime | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | ~0 | ~0 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | ~0 | ~0 |
Schemarowsets
In diesem Abschnitt werden Metadaten für Parameter, Ergebnisspalten und Schemarowsets für neue Datentypen beschrieben. Diese Informationen sind nützlich, wenn Sie einen Clientanbieter haben, der mit Tools vor SQL Server 2008 (10.0.x) SQL Server Native Client entwickelt wurde.
COLUMNS-Rowset
Die folgenden Spaltenwerte werden für date/time-Typen zurückgegeben:
Spaltentyp | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | DATETIME_PRECISION |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | 20 | NULL |
time | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | NULL |
smalldatetime | DBTYPE_DBTIMESTAMP | NULL | NULL | 0 |
datetime | DBTYPE_DBTIMESTAMP | NULL | NULL | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | NULL |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | NULL |
PROCEDURE_PARAMETERS-Rowset
Die folgenden Spaltenwerte werden für date/time-Typen zurückgegeben:
Spaltentyp | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | TYPE_NAME LOCAL_TYPE_NAME |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | 20 | date |
time | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | time |
smalldatetime | DBTYPE_DBTIMESTAMP | NULL | NULL | smalldatetime |
datetime | DBTYPE_DBTIMESTAMP | NULL | NULL | datetime |
datetime2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | datetime2 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | datetimeoffset |
PROVIDER_TYPES-Rowset
Die folgenden Zeilen werden für date/time-Typen zurückgegeben:
Typ > Column |
date | time | smalldatetime | datetime | datetime2 | datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME | date | time | smalldatetime | datetime | datetime2 | datetimeoffset |
DATA_TYPE | DBTYPE_WSTR | DBTYPE_WSTR | DBTYPE_DBTIMESTAMP | DBTYPE_DBTIMESTAMP | DBTYPE_WSTR | DBTYPE_WSTR |
COLUMN_SIZE | 10 | 16 | 16 | 23 | 27 | 34 |
LITERAL_PREFIX | ' | ' | ' | ' | ' | ' |
LITERAL_SUFFIX | ' | ' | ' | ' | ' | ' |
CREATE_PARAMS | NULL | NULL | NULL | NULL | NULL | NULL |
IS_NULLABLE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE |
CASE_SENSITIVE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE |
UNSIGNED_ATTRIBUTE | NULL | NULL | NULL | NULL | NULL | NULL |
FIXED_PREC_SCALE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
AUTO_UNIQUE_VALUE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
LOCAL_TYPE_NAME | date | time | smalldatetime | datetime | datetime2 | datetimeoffset |
MINIMUM_SCALE | NULL | NULL | NULL | NULL | NULL | NULL |
MAXIMUM_SCALE | NULL | NULL | NULL | NULL | NULL | NULL |
GUID | NULL | NULL | NULL | NULL | NULL | NULL |
TYPELIB | NULL | NULL | NULL | NULL | NULL | NULL |
VERSION | NULL | NULL | NULL | NULL | NULL | NULL |
IS_LONG | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
BEST_MATCH | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_TRUE | VARIANT_FALSE | VARIANT_FALSE |
IS_FIXEDLENGTH | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
Downlevelserver-Verhalten
Wenn eine Verbindung mit einem Server einer früheren Version als SQL Server 2008 (10.0.x) hergestellt wird, führt jeder Versuch, die neuen Servertypnamen zu verwenden (z. B. mit ICommandWithParameters::SetParameterInfo oder ITableDefinition::CreateTable) zu DB_E_BADTYPENAME.
Wenn neue Typen für Parameter oder Ergebnisse ohne Verwendung eines Typnamens gebunden werden, und entweder der neue Typ verwendet wird, um den Servertyp implizit festzulegen, oder keine gültige Konvertierung vom Servertyp zum Clienttyp vorhanden ist, wird DB_E_ERRORSOCCURRED zurückgegeben, und DBBINDSTATUS_UNSUPPORTED_CONVERSION wird als Bindungsstatus für den bei der Ausführung verwendeten Accessor festgelegt.
Alle Clientpuffertypen können verwendet werden, wenn eine Clientkonvertierung vom Puffertyp zum Servertyp für die Serverversion dieser Verbindung unterstützt wird. In diesem Kontext bedeutet der Servertyp den von ICommandWithParameters::SetParameterInfo angegebenen Typ oder impliziert durch den Puffertyp, wenn ICommandWithParameters::SetParameterInfo nicht aufgerufen wurde. Das bedeutet, dass DBTYPE_DBTIME2 und DBTYPE_DBTIMESTAMPOFFSET mit Servern früherer Versionen verwendet werden können, wenn DataTypeCompatibility auf 80 festgelegt und die Clientkonvertierung zu einem unterstützten Servertyp erfolgreich ist. Wenn der Servertyp inkorrekt ist, gibt der Server einen Fehler zurück, wenn er eine implizite Konvertierung in den tatsächlichen Servertyp nicht durchführen kann.
SSPROP_INIT_DATATYPECOMPATIBILITY-Verhalten
Wenn SSPROP_INIT_DATATYPECOMPATIBILITY auf SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000 festgelegt ist, werden die neuen Datums-/Uhrzeittypen und zugehörigen Metadaten für Clients angezeigt, wie sie für Clients auf down-Level angezeigt werden, wie in "Massenkopieänderungen" für erweiterte Datums- und Uhrzeittypen (OLE DB und ODBC) beschrieben.
Vergleichbarkeit für 'IRowsetFind'
Alle Vergleichsoperatoren sind für die neuen Datums-/Uhrzeittypen zulässig, da Sie als Zeichenfolgetypen anstatt als Datums-/Uhrzeittypen angezeigt werden.