Condividi tramite


Nuove funzionalità di data e ora con le versioni precedenti di SQL Server (OLE DB)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (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 client compilato con 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 che usano una versione di SQL Server Native Client precedenti a SQL Server 2008 (10.0.x) vedono i nuovi tipi di data/ora come colonne nvarchar . Il contenuto delle colonne è costituito da rappresentazioni letterali. Per altre informazioni, vedere la sezione "Formati di dati: stringhe e valori letterali" di Supporto dei tipi di dati per i miglioramenti di data e ora OLE DB. Le dimensioni di colonna corrispondono alla lunghezza massima in valori letterali per la precisione specificata per la colonna.

Le API del catalogo restituiscono metadati coerenti con il codice del tipo di dati di livello inferiore restituito al client (ad esempio, nvarchar) e la rappresentazione di livello inferiore 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).

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 client OLE DB Tipo di SQL Server 2005 Tipo di SQL Server 2008 (o versioni successive) Conversione risultati (da server a client) Conversione parametri (da client a server)
DBTYPE_DBDATE Datetime Data OK OK
DBTYPE_DBTIMESTAMP Campi dell'ora impostati su zero. IRowsetChange avrà esito negativo a causa del troncamento della stringa se il campo time è diverso da zero.
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP Campi della data impostati sulla data corrente. IRowsetChange avrà esito negativo a causa del troncamento delle stringhe se i secondi frazionari sono diversi da zero.

La data viene ignorata.
DBTYPE_DBTIME Time(7) Errore: valore letterale ora non valido. OK
DBTYPE_DBTIMESTAMP Errore: valore letterale ora non valido. OK
DBTYPE_DBTIMESTAMP Datetime2(3) OK OK
DBTYPE_DBTIMESTAMP Datetime2(7) OK OK
DBTYPE_DBDATE Smalldatetime Data OK OK
DBTYPE_DBTIMESTAMP Campi dell'ora impostati su zero. IRowsetChange avrà esito negativo a causa del troncamento della stringa se il campo time è diverso da zero.
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP Campi della data impostati sulla data corrente. IRowsetChange avrà esito negativo a causa del troncamento delle stringhe se i secondi frazionari sono diversi da zero.

La data viene ignorata.
DBTYPE_DBTIMESTAMP datetime2(0) OK OK

OK significa che se ha funzionato con SQL Server 2005 (9.x), deve continuare a funzionare con SQL Server 2008 (10.0.x) (o versione successiva).

Sono state prese in considerazione solo le modifiche dello schema comuni indicate di seguito:

  • Utilizzo di un nuovo tipo nei casi in cui logicamente un'applicazione richiede solo un valore di data o di ora. Tuttavia, l'applicazione è stata costretta a usare datetime o smalldatetime perché non erano disponibili tipi di data e ora separati.

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

  • Passaggio a datetime2 perché si tratta del tipo di dati preferito per data e ora.

Le applicazioni che usano i metadati del server ottenuti tramite ICommandWithParameters::GetParameterInfo o set di righe dello schema per impostare le informazioni sul tipo di parametro tramite ICommandWithParameters::SetParameterInfo avranno esito negativo durante le conversioni client in cui la rappresentazione di stringa di un tipo di origine è maggiore della rappresentazione di stringa del tipo di destinazione. Ad esempio, se un'associazione client usa DBTYPE_DBTIMESTAMP e la colonna del server è data, SQL Server Native Client convertirà il valore in "a-gg-mm hh:mm:ss.fff", ma i metadati del server verranno restituiti come nvarchar(10). L'overflow risultante restituisce DBSTATUS_E_CATCONVERTVALUE. Problemi simili si verificano con le conversioni di dati da IRowsetChange, perché i metadati del set di righe vengono impostati dai metadati del set di risultati.

Metadati per parametri e set di righe

Questa sezione descrive i metadati per parametri, colonne dei risultati e set di righe dello schema per i client compilati con una versione di SQL Server Native Client precedente a SQL Server 2008 (10.0.x).

ICommandWithParameters::GetParameterInfo

La struttura DBPARAMINFO restituisce le informazioni seguenti tramite il parametro prgParamInfo :

Tipo parametro wType ulParamSize bPrecision bScale
data DBTYPE_WSTR 10 ~0 ~0
Ora 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

Si noti che alcuni di questi intervalli di valori non sono continui. Nell'intervallo 8,10..16, ad esempio, non è presente il valore 9. Ciò è dovuto all'aggiunta di un separatore decimale quando la precisione frazionaria è maggiore di zero.

IColumnsRowset::GetColumnsRowset

Vengono restituite le colonne seguenti:

Tipo di colonna DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION
data DBTYPE_WSTR 10 NULL NULL
Ora 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 struttura DBCOLUMNINFO restituisce le informazioni seguenti:

Tipo di parametro wType ulColumnSize bPrecision bScale
data 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

Set di righe dello schema

In questa sezione vengono descritti i metadati per parametri, colonne dei risultati e set di righe dello schema per i nuovi tipi di dati. Queste informazioni sono utili perché si dispone di un provider client sviluppato usando strumenti precedenti a SQL Server 2008 (10.0.x) SQL Server Native Client.

Set di righe COLUMNS

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

Tipo di colonna DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
data DBTYPE_WSTR 10 20 NULL
Ora 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

Set di righe PROCEDURE_PARAMETERS

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

Tipo di colonna DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
data DBTYPE_WSTR 10 20 data
Ora DBTYPE_WSTR 8, 10..16 16,20..32 Ora
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

Set di righe PROVIDER_TYPES

Per i tipi di data/ora vengono restituite le righe seguenti:

Tipo ->

Colonna
data Ora smalldatetime datetime datetime2 datetimeoffset
TYPE_NAME data Ora 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
RICERCABILE 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 data Ora 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

Comportamento dei server legacy

Quando si è connessi a un server di una versione precedente a SQL Server 2008 (10.0.x), qualsiasi tentativo di usare i nuovi nomi dei tipi di server (ad esempio, con ICommandWithParameters::SetParameterInfo o ITableDefinition::CreateTable) genererà DB_E_BADTYPENAME.

Se vengono associati nuovi tipi per parametri o risultati senza l'utilizzo di un nome del tipo e il nuovo tipo viene utilizzato per specificare in modo implicito il tipo di server o non è disponibile una conversione valida dal tipo di server al tipo di client, viene restituito DB_E_ERRORSOCCURRED e DBBINDSTATUS_UNSUPPORTED_CONVERSION viene impostato come stato dell'associazione per la funzione di accesso utilizzata in fase di esecuzione.

Se è disponibile una conversione client supportata dal tipo di buffer al tipo di server per la versione del server nella connessione, è possibile utilizzare tutti i tipi di buffer client. In questo contesto, il tipo di server indica il tipo specificato da ICommandWithParameters::SetParameterInfo o implicito dal tipo di buffer se ICommandWithParameters::SetParameterInfo non è stato chiamato. Di conseguenza, è possibile utilizzare DBTYPE_DBTIME2 e DBTYPE_DBTIMESTAMPOFFSET con i server legacy o quando DataTypeCompatibility=80, se la conversione client a un tipo di server supportato ha esito positivo. Se il tipo di server non è corretto, potrebbe essere segnalato un errore dal server se questo non è in grado di eseguire una conversione implicita al tipo di server effettivo.

Comportamento di SSPROP_INIT_DATATYPECOMPATIBILITY

Quando SSPROP_INIT_DATATYPECOMPATIBILITY è impostato su SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, i nuovi tipi di data/ora e i metadati associati appaiono ai client così come vengono visualizzati per i client di livello inferiore, come descritto in Modifiche alla copia bulk per i tipi di data e ora avanzati (OLE DB e ODBC).

Possibilità di confronto per IRowsetFind

Per i nuovi tipi di data/ora sono consentiti tutti gli operatori di confronto, in quanto vengono visualizzati come tipi stringa anziché come tipi di data/ora.

Vedi anche

Miglioramenti relativi a data e ora (OLE DB)