Partager via


Nouvelles fonctionnalités de date et d’heure avec les versions précédentes de SQL Server (OLE DB)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Cette rubrique décrit le comportement attendu lorsqu’une application cliente qui utilise des fonctionnalités de date et d’heure améliorées communique avec une version de SQL Server antérieure à SQL Server 2008 (10.0.x) et lorsqu’un client compilé avec une version de SQL Server Native Client antérieure à SQL Server 2008 (10.0.x) envoie des commandes à un serveur qui prend en charge les fonctionnalités de date et d’heure améliorées.

Comportement de client de bas niveau

Les applications clientes qui utilisent une version de SQL Server Native Client antérieure à SQL Server 2008 (10.0.x) voient les nouveaux types date/heure en tant que colonnes nvarchar . Les contenus des colonnes sont des représentations littérales. Pour plus d’informations, consultez la section « Formats de données : chaînes et littéraux » de la prise en charge des types de données pour les améliorations de date et d’heure OLE DB. La taille de colonne est la longueur littérale maximale pour la précision spécifiée pour la colonne.

Les API catalogue retournent des métadonnées cohérentes avec le code de type de données de bas niveau retourné au client (par exemple, nvarchar) et la représentation de bas niveau associée (par exemple, le format littéral approprié). Toutefois, le nom du type de données retourné sera le nom de type SQL Server 2008 (10.0.x).

Lorsqu’une application cliente de bas niveau s’exécute sur un serveur SQL Server 2008 (10.0.x) (ou version ultérieure) sur lequel les modifications de schéma apportées aux types date/heure ont été effectuées, le comportement attendu est le suivant :

Type du client OLE DB Type SQL Server 2005 SQL Server 2008 (ou versions ultérieures) Conversion de résultat (serveur vers client) Conversion de paramètre (client vers serveur)
DBTYPE_DBDATE Datetime Date OK OK
DBTYPE_DBTIMESTAMP Champs d'heure définis à zéro. IRowsetChange échoue en raison de la troncation de chaîne si le champ de temps est différent de zéro.
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP Champs de date définis à la date actuelle. IRowsetChange échoue en raison de la troncation de chaîne si les fractions de secondes ne sont pas nulles.

La date est ignorée.
DBTYPE_DBTIME Time(7) Échec : littéral de temps non valide. OK
DBTYPE_DBTIMESTAMP Échec : littéral de temps non valide. OK
DBTYPE_DBTIMESTAMP Datetime2(3) OK OK
DBTYPE_DBTIMESTAMP Datetime2(7) OK OK
DBTYPE_DBDATE Smalldatetime Date OK OK
DBTYPE_DBTIMESTAMP Champs d'heure définis à zéro. IRowsetChange échoue en raison de la troncation de chaîne si le champ de temps est différent de zéro.
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP Champs de date définis à la date actuelle. IRowsetChange échoue en raison de la troncation de chaîne si les fractions de secondes ne sont pas nulles.

La date est ignorée.
DBTYPE_DBTIMESTAMP Datetime2(0) OK OK

OK signifie que s’il a fonctionné avec SQL Server 2005 (9.x), il doit continuer à fonctionner avec SQL Server 2008 (10.0.x) (ou version ultérieure).

Seules les modifications de schéma communes suivantes ont été considérées :

  • Utilisation d'un nouveau type alors qu'en toute logique une application requiert uniquement une valeur de date ou d'heure. Toutefois, l’application a été forcée d’utiliser datetime ou smalldatetime , car les types de date et d’heure distincts n’étaient pas disponibles.

  • Utilisation d'un nouveau type pour gagner en précision sur les fractions de seconde.

  • Passage à datetime2 , car il s’agit du type de données préféré pour la date et l’heure.

Les applications qui utilisent les métadonnées du serveur obtenues via ICommandWithParameters ::GetParameterInfo ou les ensembles de lignes de schéma pour définir les informations de type de paramètre via ICommandWithParameters ::SetParameterInfo échouent lors des conversions clientes où la représentation sous forme de chaîne d’un type source est supérieure à la représentation sous forme de chaîne du type de destination. Par exemple, si une liaison cliente utilise DBTYPE_DBTIMESTAMP et que la colonne du serveur est la date, SQL Server Native Client convertit la valeur en « aaaa-dd-mm hh :mm :ss.fff », mais les métadonnées du serveur sont retournées en tant que nvarchar(10). Le dépassement de capacité résultant provoque DBSTATUS_E_CATCONVERTVALUE. Des problèmes similaires surviennent avec les conversions de données par IRowsetChange, car les métadonnées de l’ensemble de lignes sont définies à partir des métadonnées de l’ensemble de résultats.

Métadonnées de paramètre et d'ensemble de lignes

Cette section décrit les métadonnées des paramètres, des colonnes de résultats et des ensembles de lignes de schéma pour les clients compilés avec une version de SQL Server Native Client antérieure à SQL Server 2008 (10.0.x).

ICommandWithParameters::GetParameterInfo

La structure DBPARAMINFO retourne les informations suivantes via le paramètre prgParamInfo :

Type de paramètre 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

Notez que certaines de ces plages de valeurs sont discontinues ; par exemple, 9 est manquant dans 8,10..16. Cela est dû à l'ajout d'une virgule décimale lorsque la précision fractionnaire est supérieure à zéro.

IColumnsRowset::GetColumnsRowset

Les colonnes suivantes sont retournées :

Type de colonne 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

La structure DBCOLUMNINFO retourne les informations suivantes :

Type de paramètre 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

Ensembles de lignes de schéma

Cette section décrit les métadonnées des paramètres, des colonnes de résultats et des ensembles de lignes de schéma pour les nouveaux types de données. Ces informations sont utiles si vous disposez d’un fournisseur client développé à l’aide d’outils antérieurs à SQL Server 2008 (10.0.x) SQL Server Native Client.

Ensemble de lignes COLUMNS

Les valeurs de colonnes suivantes sont retournées pour les types date/heure :

Type de colonne 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

Ensemble de lignes PROCEDURE_PARAMETERS

Les valeurs de colonnes suivantes sont retournées pour les types date/heure :

Type de colonne 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

Ensemble de lignes PROVIDER_TYPES

Les lignes suivantes sont retournées pour les types date/heure :

Type ->

Colonne
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

Comportement de serveur de bas niveau

Lorsqu’il est connecté à un serveur d’une version antérieure à SQL Server 2008 (10.0.x), toute tentative d’utilisation des nouveaux noms de type de serveur (par exemple, avec ICommandWithParameters ::SetParameterInfo ou ITableDefinition ::CreateTable) entraîne DB_E_BADTYPENAME.

Si de nouveaux types sont liés pour des paramètres ou des résultats sans l'utilisation d'un nom de type, et si le nouveau type est utilisé pour spécifier le type serveur implicitement ou s'il n'existe pas de conversion valide du type serveur en type client, DB_E_ERRORSOCCURRED est retourné ; par ailleurs, DBBINDSTATUS_UNSUPPORTED_CONVERSION est défini en tant qu'état de liaison pour l'accesseur utilisé au moment de l'exécution.

S'il existe une conversion cliente prise en charge du type de mémoire tampon en type serveur pour la version du serveur de la connexion, tous les types de mémoires tampons clients peuvent être utilisés. Dans ce contexte, le type de serveur signifie le type spécifié par ICommandWithParameters ::SetParameterInfo, ou implicite par le type de mémoire tampon si ICommandWithParameters ::SetParameterInfo n’a pas été appelé. En d'autres termes, DBTYPE_DBTIME2 et DBTYPE_DBTIMESTAMPOFFSET peuvent être utilisés avec des serveurs de bas niveau, ou lorsque DataTypeCompatibility=80, si la conversion cliente vers un type serveur pris en charge réussit. Bien entendu, si le type serveur est incorrect, une erreur peut toujours être signalée par le serveur lorsque ce dernier ne peut pas effectuer de conversion implicite vers le type serveur effectif.

Comportement de SSPROP_INIT_DATATYPECOMPATIBILITY

Lorsque SSPROP_INIT_DATATYPECOMPATIBILITY est défini sur SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, les nouveaux types de date/heure et les métadonnées associées s’affichent pour les clients de bas niveau, comme décrit dans Modifications de copie en bloc pour les types de date et d’heure améliorés (OLE DB et ODBC).

Comparabilité pour IRowsetFind

Tous les opérateurs de comparaison sont autorisés pour les nouveaux types date/heure, car ils apparaissent sous forme de types chaîne et non sous forme de types date/heure.

Voir aussi

Améliorations des types de données de date et d’heure (OLE DB)