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.