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)