Comportamento dei tipi di data e ora migliorati con le versioni di SQL Server precedenti (ODBC)

Si applica a:SQL ServerDatabase SQL diAzure Istanzagestita di SQL di Azure Azure Synapse Analytics PlatformSystem (PDW)

Questo argomento descrive il comportamento previsto quando un'applicazione client che usa funzionalità avanzate di data e ora comunica con una versione di SQL Server precedente a SQL Server 2008 (10.0.x) e quando un'applicazione client che usa componenti di Microsoft Data Access, Componenti di Accesso ai dati di Windows o una versione di SQL Server Native Client precedente a SQL Server 2008 (10.0.x) invia comandi a un server che supporta funzionalità avanzate di data e ora.

Comportamento dei client legacy

Le applicazioni client compilate usando una versione di SQL Server Native Client precedente a SQL Server 2008 (10.0.x) vedono i nuovi tipi di data/ora come colonne nvarchar. Il contenuto della colonna è rappresentato dalle rappresentazioni letterali, come descritto nella sezione "Formati di dati: Stringhe e valori letterali" di Supporto dei tipi di dati per i miglioramenti di data e ora ODBC. Le dimensioni di colonna corrispondono alla lunghezza massima in valori letterali per la precisione frazionaria dei secondi specificata per la colonna.

Le API di catalogo restituiranno metadati consistenti con il codice del tipo di dati legacy restituito al client, ad esempio nvarchar, e la rappresentazione legacy associata, ad esempio il formato letterale appropriato. Tuttavia, il nome del tipo di dati restituito sarà il nome del tipo reale di SQL Server 2008 (10.0.x).

I metadati delle istruzioni restituiti da SQLDescribeCol, SQLDescribeParam, SQGetDescField e SQLColAttribute restituiranno metadati coerenti con il tipo di livello inferiore in tutti i aspetti, incluso il nome del tipo. Un esempio di tale tipo di livello inferiore è nvarchar.

Quando un'applicazione client di livello inferiore viene eseguita su un server SQL Server 2008 (10.0.x) (o versione successiva) in cui sono state apportate modifiche dello schema ai tipi di data/ora, il comportamento previsto è il seguente:

Tipo di SQL Server 2005 Tipo SQL Server 2008 (10.0.x) (o versione successiva) Tipo del client ODBC Conversione risultati (da SQL a C) Conversione parametri (da C a SQL)
Datetime Date SQL_C_TYPE_DATE Ok OK (1)
SQL_C_TYPE_TIMESTAMP Campi dell'ora impostati su zero. OK (2)

Esito negativo se il campo dell'ora è diverso da zero. Funziona con SQL Server 2005 (9.x).
Time(0) SQL_C_TYPE_TIME Ok OK (1)
SQL_C_TYPE_TIMESTAMP Campi della data impostati sulla data corrente. OK (2)

La data viene ignorata. Esito negativo se i secondi frazionari sono diversi da zero. Funziona con SQL Server 2005 (9.x).
Time(7) SQL_C_TIME Errore: valore letterale ora non valido. OK (1)
SQL_C_TYPE_TIMESTAMP Errore: valore letterale ora non valido. OK (1)
Datetime2(3) SQL_C_TYPE_TIMESTAMP Ok OK (1)
Datetime2(7) SQL_C_TYPE_TIMESTAMP Ok Il valore viene arrotondato a 1/300 di secondo dalla conversione client.
Smalldatetime Date SQL_C_TYPE_DATE Ok Ok
SQL_C_TYPE_TIMESTAMP Campi dell'ora impostati su zero. OK (2)

Esito negativo se il campo dell'ora è diverso da zero. Funziona con SQL Server 2005 (9.x).
Time(0) SQL_C_TYPE_TIME Ok Ok
SQL_C_TYPE_TIMESTAMP Campi della data impostati sulla data corrente. OK (2)

La data viene ignorata. Esito negativo se i secondi frazionari sono diversi da zero.

Funziona con SQL Server 2005 (9.x).
datetime2(0) SQL_C_TYPE_TIMESTAMP Ok Ok

Descrizione dei simboli

Simbolo Significato
1 Se ha funzionato con SQL Server 2005 (9.x), deve continuare a funzionare con una versione più recente di SQL Server.
2 Un'applicazione che ha funzionato con SQL Server 2005 (9.x) potrebbe non riuscire con una versione più recente di SQL Server.

Si noti che sono state prese in considerazione solo le modifiche dello schema comuni, elencate di seguito:

  • Utilizzo di un nuovo tipo nei casi in cui logicamente un'applicazione richiede solo un valore di data o di ora. Nelle versioni precedenti viene imposto l'utilizzo di datetime o smalldatetime all'applicazione in quanto non sono disponibili tipi di data e ora distinti.

  • Utilizzo di un nuovo tipo per ottenere precisione o accuratezza maggiore nei secondi frazionari.

  • Passaggio a datetime2 in quanto tipo di dati preferito per la data e l'ora.

Metadati di colonna restituiti da SQLColumns, SQLProcedureColumns e SQLSpecialColumns

Per i tipi di data/ora vengono restituiti i valori di colonna seguenti:

Tipo colonna 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 non restituisce SQL_DATA_TYPE, SQL_DATETIME_SUB, CHAR_OCTET_LENGTH o SS_DATA_TYPE.

Metadati del tipo di dati restituiti da SQLGetTypeInfo

Per i tipi di data/ora vengono restituiti i valori di colonna seguenti:

Tipo colonna 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
RICERCABILE 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

Comportamento dei server legacy

Quando si è connessi a un'istanza del server di una versione precedente che SQL Server 2008 (10.0.x), qualsiasi tentativo di usare i nuovi tipi di server o i codici di descrizione associati e i campi del descrittore genererà SQL_ERROR restituito. Verrà generato un record di diagnostica con SQLSTATE HY004 e il messaggio "Tipo di dati non valido per la versione del server in connessione" o con 07006 e il messaggio "Violazione dell'attributo del tipo di dati".

Vedi anche

Miglioramenti relativi a data e ora (ODBC)