Comportement des types de date et d'heure améliorés avec les versions SQL Server antérieures (ODBC)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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’une application cliente utilise des composants Microsoft Data Access, des composants d’accès aux données Windows ou 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 ont été compilées à l’aide d’une version de SQL Server Native Client antérieure à SQL Server 2008 (10.0.x) voient les nouveaux types date/heure sous forme de colonnes nvarchar. Le contenu de la colonne est les représentations littérales, comme décrit dans la section « Formats de données : chaînes et littéraux » de la rubrique Prise en charge des types de données pour les améliorations de date et d’heure ODBC. La taille de colonne correspond à la longueur littérale maximale pour la précision en fractions de seconde spécifiée pour la colonne.

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

Les métadonnées d’instruction retournées par SQLDescribeCol, SQLDescribeParam, SQGetDescField et SQLColAttribute retournent des métadonnées cohérentes avec le type de bas niveau à tous les égards, y compris le nom du type. Un exemple de ce type de bas niveau est nvarchar.

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 des modifications de schéma ont été apportées aux types de date/heure, le comportement attendu est le suivant :

Type SQL Server 2005 SQL Server 2008 (10.0.x) (ou version ultérieure) Type Type de client ODBC Conversion des résultats (de SQL vers C) Conversion des paramètres (de C vers SQL)
Datetime Date SQL_C_TYPE_DATE Ok OK (1)
SQL_C_TYPE_TIMESTAMP Champs d'heure définis à zéro. OK (2)

Échoue si le champ d'heure n'est pas nul. Fonctionne avec SQL Server 2005 (9.x).
Time(0) SQL_C_TYPE_TIME Ok OK (1)
SQL_C_TYPE_TIMESTAMP Champs de date définis à la date actuelle. OK (2)

La date est ignorée. Échoue si les fractions de secondes ne sont pas égales à zéro. Fonctionne avec SQL Server 2005 (9.x).
Time(7) SQL_C_TIME Échec : littéral d’heure non valide. OK (1)
SQL_C_TYPE_TIMESTAMP Échec : littéral d’heure non valide. OK (1)
Datetime2(3) SQL_C_TYPE_TIMESTAMP Ok OK (1)
Datetime2(7) SQL_C_TYPE_TIMESTAMP Ok La valeur sera arrondie à 1/300e de seconde par la conversion cliente.
Smalldatetime Date SQL_C_TYPE_DATE OK OK
SQL_C_TYPE_TIMESTAMP Champs d'heure définis à zéro. OK (2)

Échoue si le champ d'heure n'est pas nul. Fonctionne avec SQL Server 2005 (9.x).
Time(0) SQL_C_TYPE_TIME OK OK
SQL_C_TYPE_TIMESTAMP Champs de date définis à la date actuelle. OK (2)

La date est ignorée. Échoue si les fractions de seconde ne sont pas nulles.

Fonctionne avec SQL Server 2005 (9.x).
Datetime2(0) SQL_C_TYPE_TIMESTAMP OK OK

Liste des symboles

Symbole Signification
1 S’il fonctionnait avec SQL Server 2005 (9.x), il devrait continuer à fonctionner avec une version plus récente de SQL Server.
2 Une application qui fonctionnait avec SQL Server 2005 (9.x) peut échouer avec une version plus récente de SQL Server.

Notez que seules les modifications de schéma courantes ont été considérées. Les modifications courantes sont les suivantes :

  • 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 des données datetime ou smalldatetime en raison du manque de types de date et d'heure distincts.

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

  • Passage à datetime2, car il représente le type de données de date et d'heure préféré.

Métadonnées de colonne retournées par SQLColumns, SQLProcedureColumns et SQLSpecialColumns

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

Type de colonne 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 ne retourne pas SQL_DATA_TYPE, SQL_DATETIME_SUB, CHAR_OCTET_LENGTH ni SS_DATA_TYPE.

Métadonnées de type de données retournées par SQLGetTypeInfo

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

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

Comportement de serveur de bas niveau

Quand vous êtes connecté à un serveur instance d’une version antérieure qui SQL Server 2008 (10.0.x), toute tentative d’utilisation des nouveaux types de serveurs ou des codes de métadonnées et champs descripteurs associés entraîne le retour de SQL_ERROR. Un enregistrement de diagnostic sera généré avec SQLSTATE HY004 et le message « Type de données SQL non valide pour la version du serveur lors de la connexion », ou avec 07006 et « Violation de l'attribut de type de données restreint ».

Voir aussi

Améliorations de la date et de l’heure (ODBC)