Modifiche apportate alla copia bulk per i tipi di data/ora migliorati (OLE DB e ODBC)
In questo argomento vengono descritti i miglioramenti apportati ai tipi di data/ora per supportare la funzionalità di copia bulk. Le informazioni incluse in questo argomento sono valide sia per OLE DB sia per ODBC in SQL Server Native Client.
File di formato
Nella tabella seguente viene descritto l'input utilizzato per specificare i tipi di data/ora e i nomi dei tipi di dati del file host corrispondenti quando si compilano file di formato in modo interattivo.
Tipo di archiviazione di file |
Tipo di dati del file host |
Risposta alla richiesta: "Specificare il tipo di archiviazione di file del campo <nome_campo> [<impostazione predefinita>]": |
---|---|---|
Datetime |
SQLDATETIME |
d |
Smalldatetime |
SQLDATETIM4 |
D |
Date |
SQLDATE |
de |
Ora |
SQLTIME |
te |
Datetime2 |
SQLDATETIME2 |
d2 |
Datetimeoffset |
SQLDATETIMEOFFSET |
do |
Il file XSD per i file di formato XML includerà le aggiunte seguenti:
<xs:complexType name="SQLDATETIME2">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLDATETIMEOFFSET">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLDATE">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLTIME">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
File di dati di tipo carattere
Nei file di dati di tipo carattere i valori di data e ora vengono rappresentati come descritto nella sezione "Formati di dati: stringhe e valori letterali" di Supporto dei tipi di dati per i miglioramenti relativi alla data/ora ODBC per ODBC o di Supporto dei tipi di dati per i miglioramenti dei tipi di data/ora OLE DB per OLE DB.
Nei file di dati nativi, i valori di data e ora per i quattro nuovi tipi vengono rappresentati come le rispettive rappresentazioni TDS (Tabular Data Stream) con scala 7, in quanto si tratta del valore massimo supportato da SQL Server e nei file di dati con estensione bcp non viene archiviata la scala di tali colonne. Non è stata apportata alcuna modifica all'archiviazione dei tipi datetime e smalldatetime esistenti o delle rispettive rappresentazioni TDS.
Di seguito vengono indicate le dimensioni dello spazio di archiviazione per i diversi tipi di archiviazione per OLE DB:
Tipo di archiviazione di file |
Dimensioni dello spazio di archiviazione in byte |
---|---|
datetime |
8 |
smalldatetime |
4 |
data |
3 |
ora |
6 |
datetime2 |
9 |
datetimeoffset |
11 |
Di seguito vengono indicate le dimensioni per ODBC: Si noti che non è necessario archiviare la precisione in alcun file di formato o di dati, in quanto il file BCP.exe recupera sempre la precisione dal server.
Tipo di archiviazione di file |
Dimensioni dello spazio di archiviazione in byte |
Formato di archiviazione |
---|---|---|
datetime (d) |
8 |
TDS |
smalldatetime (D) |
4 |
TDS |
date (de) |
3 |
TDS |
time (te) |
6 |
TDS |
datetime2 (d2) |
9 |
TDS |
datetimeoffset (do) |
11 |
TDS |
Tipi BCP in sqlncli.h
Di seguito vengono indicati i tipi definiti in sqlncli.h per l'utilizzo con le estensioni API BCP in ODBC. Tali tipi vengono passati con il parametro eUserDataType di IBCPSession::BCPColFmt in OLE DB.
Tipo di archiviazione di file |
Tipo di dati del file host |
Tipo in sqlncli.h per l'utilizzo con IBCPSession::BCPColFmt |
Valore |
---|---|---|---|
Datetime |
SQLDATETIME |
BCP_TYPE_SQLDATETIME |
0x3d |
Smalldatetime |
SQLDATETIM4 |
BCP_TYPE_SQLDATETIME4 |
0x3a |
Date |
SQLDATE |
BCP_TYPE_SQLDATE |
0x28 |
Ora |
SQLTIME |
BCP_TYPE_SQLTIME |
0x29 |
Datetime2 |
SQLDATETIME2 |
BCP_TYPE_SQLDATETIME2 |
0x2a |
Datetimeoffset |
SQLDATETIMEOFFSET |
BCP_TYPE_SQLDATETIMEOFFSET |
0x2b |
Conversioni dei tipi di dati BCP
Nelle tabelle seguenti vengono fornite informazioni sulla conversione.
Nota OLE DB Le conversioni seguenti vengono eseguite da IBCPSession. IRowsetFastLoad utilizza le conversioni OLE DB come definito in Conversioni eseguite da client a server. Si noti che i valori datetime vengono arrotondati a 1/300 di secondo, mentre per i valori smalldatetime i secondi vengono impostati su zero in seguito all'esecuzione delle conversioni client descritte di seguito. L'arrotondamento dei valori datetime viene applicato a ore e minuti, ma non alla data.
A --> Da |
data |
ora |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
char |
wchar |
---|---|---|---|---|---|---|---|---|
Date |
1 |
- |
1,6 |
1,6 |
1,6 |
1,5,6 |
1,3 |
1,3 |
Ora |
N/D |
1,10 |
1,7,10 |
1,7,10 |
1,7,10 |
1,5,7,10 |
1,3 |
1,3 |
Smalldatetime |
1,2 |
1,4,10 |
1 |
1 |
1,10 |
1,5,10 |
1,11 |
1,11 |
Datetime |
1,2 |
1,4,10 |
1,12 |
1 |
1,10 |
1,5,10 |
1,11 |
1,11 |
Datetime2 |
1,2 |
1,4,10 |
1, 10 (ODBC) 1, 12 (OLE DB) |
1,10 |
1,10 |
1,5,10 |
1,3 |
1,3 |
Datetimeoffset |
1,2,8 |
1,4,8,10 |
1,8,10 |
1,8,10 |
1,8,10 |
1,10 |
1,3 |
1,3 |
char/wchar (date) |
9 |
- |
9, 6 (ODBC) 9, 6, 12 (OLE DB) |
9, 6 (ODBC) 9, 6, 12 (OLE DB) |
9,6 |
9,5,6 |
N/D |
N/D |
char/wchar (time) |
- |
9,10 |
9, 7, 10 (ODBC) 9, 7, 10, 12 (OLE DB) |
9, 7, 10 (ODBC) 9, 7, 10, 12 (OLE DB) |
9,7,10 |
9,5,7,10 |
N/D |
N/D |
char/wchar (datetime) |
9,2 |
9,4,10 |
9, 10 (ODBC) 9, 10, 12 (OLE DB) |
9, 10 (ODBC) 9, 10, 12 (OLE DB) |
9,10 |
9,5,10 |
N/D |
N/D |
char/wchar (datetimeoffset) |
9,2,8 |
9,4,8,10 |
9, 8, 10 (ODBC) 9, 8, 10, 12 (OLE DB) |
9, 8, 10 (ODBC) 9, 8, 10, 12 (OLE DB) |
9,8,10 |
9,10 |
N/D |
N/D |
Descrizione dei simboli
Simbolo |
Significato |
||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- |
Non viene supportata alcuna conversione. Viene generato un record di diagnostica ODBC con SQLSTATE 07006 e il messaggio "Violazione dell'attributo del tipo di dati". |
||||||||||||||||||||||||||||||||
1 |
Se i dati specificati non sono validi, viene generato un record di diagnostica ODBC con SQLSTATE 22007 e il messaggio "Formato di datetime non valido". Per i valori datetimeoffset, la parte relativa all'ora deve essere compresa nell'intervallo supportato in seguito alla conversione in UTC, anche se non è necessaria alcuna conversione in UTC. Ciò è dovuto al fatto che TDS e il server in genere normalizzano l'ora nei valori datetimeoffset per UTC. Di conseguenza, il client deve verificare che i componenti relativi all'ora siano compresi nell'intervallo supportato in seguito alla conversione in UTC. |
||||||||||||||||||||||||||||||||
2 |
Il componente relativo all'ora viene ignorato. |
||||||||||||||||||||||||||||||||
3 |
Per ODBC, se si verifica un troncamento con perdita di dati, viene generato un record di diagnostica con SQLSTATE 22001 e il messaggio "Troncamento a destra della stringa di dati". Il numero di cifre per i secondi frazionari, ovvero la scala, è determinato dalle dimensioni della colonna di destinazione in base alla tabella seguente. Per dimensioni di colonna maggiori dell'intervallo specificato nella tabella, si presuppone una scala di 7. Questa conversione deve consentire fino a nove cifre per i secondi frazionari, il massimo consentito in ODBC.
Per OLE DB, se si verifica un troncamento con perdita di dati, viene inserito un errore. Per datetime2 il numero di cifre per i secondi frazionari, ovvero la scala, è determinato dalle dimensioni della colonna di destinazione in base alla tabella seguente. Per dimensioni di colonna maggiori dell'intervallo specificato nella tabella, si presuppone una scala 9. Questa conversione deve consentire fino a nove cifre per i secondi frazionari, il massimo consentito da OLE DB.
|
||||||||||||||||||||||||||||||||
4 |
Il componente relativo alla data viene ignorato. |
||||||||||||||||||||||||||||||||
5 |
Il fuso orario è impostato su UTC, ad esempio 00:00. |
||||||||||||||||||||||||||||||||
6 |
L'ora è impostata su zero. |
||||||||||||||||||||||||||||||||
7 |
La data è impostata su 1900-01-01. |
||||||||||||||||||||||||||||||||
8 |
La differenza di fuso orario viene ignorata. |
||||||||||||||||||||||||||||||||
9 |
La stringa viene analizzata e convertita in un valore date, datetime, datetimeoffset o time a seconda del primo carattere di punteggiatura rilevato e della presenza degli altri componenti. La stringa viene quindi convertita nel tipo di destinazione, in base alle regole indicate nella tabella alla fine di questo argomento per il tipo di origine individuato dal processo. Se i dati forniti non possono essere analizzati senza errore o se qualsiasi componente è al di fuori dell'intervallo consentito o non vi è conversione dal tipo del valore letterale al tipo di destinazione, viene inserito un errore (OLE DB) o viene generato un record di diagnostica ODBC con SQLSTATE 22018 e il messaggio "Carattere non valido per la specifica del cast". Per i parametri datetime e smalldatetime, se l'anno non è compreso nell'intervallo supportato da questi tipi, viene inserito un errore (OLE DB) o viene generato un record di diagnostica con SQLSTATE 22007 e il messaggio "Formato di datetime non valido". Per datetimeoffset, il valore deve essere compreso nell'intervallo supportato in seguito alla conversione in UTC, anche se non è necessaria alcuna conversione in UTC. Ciò è dovuto al fatto che TDS e il server normalizzano sempre l'ora in valori datetimeoffset per UTC. Il client deve pertanto verificare che i componenti relativi all'ora siano compresi nell'intervallo supportato in seguito alla conversione in UTC. Se il valore non è compreso nell'intervallo UTC supportato, viene inserito un errore (OLE DB) o viene generato un record di diagnostica con SQLSTATE 22007 e il messaggio "Formato di datetime non valido". |
||||||||||||||||||||||||||||||||
10 |
Se si verifica un troncamento con perdita di dati in una conversione da client a server, viene inserito un errore (OLE DB) o viene generato un record di diagnostica ODBC con SQLSTATE 22008 e il messaggio "Overflow del campo Datetime". Questo errore si verifica anche se il valore non è incluso nell'intervallo che può essere rappresentato dall'intervallo UTC utilizzato dal server. Se si verifica un troncamento dei secondi o dei secondi frazionari in una conversione da server a client, viene generato solo un avviso. |
||||||||||||||||||||||||||||||||
11 |
Se si verifica un troncamento con perdita di dati, viene generato un record di diagnostica. In una conversione da server a client, il record è un avviso (ODBC SQLSTATE S1000). In una conversione da client a server, il record è un errore (ODBC SQLSTATE 22001). |
||||||||||||||||||||||||||||||||
12 |
I secondi vengono impostati su zero e i secondi frazionari vengono ignorati. Non è possibile alcun errore di troncamento. |
||||||||||||||||||||||||||||||||
N/D |
Viene mantenuto il comportamento di SQL Server 2005 e versioni precedenti. |