Freigeben über


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.

Weitere Informationen

Verbesserungen bei Datum und Uhrzeit (OLE DB)