Mapping dei tipi di dati con le query distribuite
Un provider OLE DB espone i tipi di dati in base agli identificatori dei tipi OLE DB denominati DBTYPE. Tramite l'operazione di mapping è possibile eseguire le seguenti conversioni tra tipi di dati OLE DB e i tipi di dati di sistema di SQL Server:
Da tipi di dati OLE DB a tipi di dati di sistema di SQL Server. Questa conversione viene eseguita quando SQL Server legge i dati dell'origine dei dati OLE DB tramite istruzioni SELECT o nella fase di lettura delle istruzioni UPDATE, INSERT o DELETE.
Da tipi di dati di sistema di SQL Server a tipi di dati OLE DB. Questo tipo di conversione viene eseguita quando SQL Server scrive i dati, in genere tramite istruzioni INSERT o UPDATE, nell'origine dei dati OLE DB in cui la tabella modificata è una tabella remota.
Mapping dei tipi di dati tra il provider OLE DB e SQL Server
Il mapping dei tipi di dati dal provider OLE DB a SQL Server definisce le espressioni e i confronti consentiti, nonché le conversioni esplicite valide che coinvolgono dati remoti. Questo tipo di mapping è illustrato nella tabella seguente.
La validità dei tipi di dati delle colonne di una tabella remota utilizzati nelle espressioni è determinata dalla seguente regola: il valore di una colonna remota è valido in un'espressione Transact-SQL se il tipo di dati mappato SQL Server corrispondente nella tabella del mapping dei tipi è valido nello stesso contesto.
Ad esempio, si consideri l'espressione local_column OPERATOR remote_column. Nell'espressione,local_column è una colonna di una tabella locale e remote_column è una colonna di una tabella remota. L'espressione è valida se OPERATOR è un operatore valido per il tipo di dati della colonna locale e per il tipo di dati al quale è mappato il tipo di dati DBTYPE di remote_column.
Allo stesso modo, l'espressione CAST(remote_column AS data_type_1) è consentita se il tipo di dati DBTYPE di remote_column è mappato al tipo di dati di sistema di SQL Serverdata_type_2 e se è consentita la conversione esplicita da data_type_2 a data_type_1. Ad esempio, una colonna con il tipo di dati DBTYPE_DATE nel provider può essere convertita in una colonna di tipo datetime in SQL Server. La conversione diretta di dati DBTYPE_DATE in varchar non è tuttavia consentita.
Nella tabella seguente è illustrata la tabella relativa al mapping dei tipi di dati. Tramite l'indicatore DBTYPE e il relativo valore DBCOLUMNFLAGS di una colonna, è possibile trovare il tipo di dati di SQL Server corrispondente.
DBTYPE |
DBCOLUMNFLAGS |
Tipo di dati di SQL Server |
---|---|---|
DBTYPE_I1 |
numeric(3, 0)1 |
|
DBTYPE_I2 |
smallint |
|
DBTYPE_I4 |
int |
|
DBTYPE_I8 |
bigint |
|
DBTYPE_UI1 |
tinyint |
|
DBTYPE_UI1 |
numeric(5,0) |
|
DBTYPE_UI1 |
numeric(10,0) |
|
DBTYPE_UI1 |
numeric(20,0) |
|
DBTYPE_R4 |
float |
|
DBTYPE_R8 |
real |
|
DBTYPE_NUMERIC |
numeric |
|
DBTYPE_DECIMAL |
decimal |
|
DBTYPE_CY |
money |
|
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISLONG = true |
ntext |
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
nchar |
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
nvarchar |
DBTYPE_IDISPATCH |
Errore |
|
DBTYPE_ERROR |
Errore |
|
DBTYPE_BOOL |
bit |
|
DBTYPE_VARIANT |
nvarchar(4000) |
|
DBTYPE_IUNKNOWN |
Errore |
|
DBTYPE_GUID |
uniqueidentifier |
|
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISLONG = true o dimensioni massime della colonna > 8.000 byte. |
image |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISLONG = true e dimensioni della colonna illimitate. |
varbinary(max) |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISROWVER = true, DBCOLUMNFLAGS_ISFIXEDLENGTH = true, dimensioni della colonna = 8 |
timestamp |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
binary |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
varbinary |
DBTYPE_STR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
char |
DBTYPE_ STR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
varchar |
DBTYPE_STR |
DBCOLUMNFLAGS_ISLONG = true o dimensioni massime della colonna > 8.000 caratteri. |
text |
DBTYPE_STR |
DBCOLUMNFLAGS_ISLONG = true e dimensioni della colonna illimitate. |
varchar(max) |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISFIXED |
nchar |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
nvarchar |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISLONG = true o dimensioni massime della colonna > 4.000 caratteri. |
ntext |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISLONG = true e dimensioni della colonna illimitate. |
nvarchar(max) |
DBTYPE_UDT |
Tipo di SQL Server definito dall'utente, se registrato. |
|
DBTYPE_DATE |
date, datetime, datetime2, datetimeoffset |
|
DBTYPE_DBDATE |
date, datetime, datetime2, datetimeoffset (il livello di compatibilità è inferiore a 9.0) |
|
DBTYPE_DBTIME |
time, datetime, datetime2, datetimeoffset |
|
DBTYPE_DBTIME_EX |
time, datetime2, datetimeoffset |
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset, datetime |
|
---|---|---|
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset |
|
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset |
|
DBTYPE_ARRAY |
Errore |
|
DBTYPE_BYREF |
Ignorato |
|
DBTYPE_VECTOR |
Errore |
|
DBTYPE_RESERVED |
Errore |
|
DBTYPE_XML |
xml (Consentito solo nelle query pass-through) |
1numeric(p,s) indica il tipo di dati di SQL Servernumeric con precisione p e scala s.
Nota
Se è necessario convertire i dati in un tipo di dati di SQL Server diverso dal tipo predefinito indicato nella tabella, è necessario eseguire una conversione esplicita tramite la funzione CAST o CONVERT. Per ulteriori informazioni, vedere CAST e CONVERT (Transact-SQL).
Le informazioni relative all'indicatore DBTYPE e al valore DBCOLUMNFLAGS sono derivate dal provider tramite il set di righe dello schema COLUMNS o l'interfaccia IColumnsInfo. Per il set di righe dello schema COLUMNS, le colonne DATA_TYPE e COLUMN_FLAGS rappresentano i valori DBTYPE e DBCOLUMNFLAGS. Per l'interfaccia IColumnsInfo::GetColumnInfo, i membri wType e dwFlags della struttura DBCOLUMNINFO rappresentano tali valori.
Mapping dei tipi di dati tra SQL Server e il provider OLE DB
I tipi di dati di sistema di SQL Server vengono mappati ai tipi OLE DB tramite il mapping mostrato nella tabella precedente. Il mapping di un tipo di dati di SQL ServerS1 a un tipo OLE DB specifico T è consentito solo se si verifica una delle condizioni seguenti:
Il mapping corrispondente è disponibile nella tabella del mapping dei tipi di dati.
È consentita la conversione implicita del tipo di dati S1 in un altro tipo di dati di SQL ServerS2 e il mapping tra S2 e T è definito nella tabella del mapping dei tipi di dati.
Mapping in SQL Server 2008 dei tipi di dati di data e ora ricevuti da un server remoto
Nella tabella seguente viene mostrato il mapping dei tipi di dati date e time inviati da un'origine dati OLE DB a un'istanza di SQL Server 2008. Questa conversione viene eseguita quando in SQL Server 2008 viene eseguita la lettura dei dati dall'origine dati OLE DB, tramite istruzioni SELECT o nella fase di lettura delle istruzioni UPDATE, INSERT o DELETE. Se il tipo di dati di una colonna remota è date, time, dateime2 o datetimeoffset, tale tipo viene restituito se il livello di compatibilità del database è 100 o superiore. Se il livello di compatibilità è inferiore, SQL Server 2008 effettua una conversione implicita a datetime.
Tipo OLE DB |
Se il server remoto è SQL Server 2008 viene restituito: |
Se il server remoto è SQL Server 2005 o SQL Server 2000 viene restituito: |
Se il server remoto non è SQL Server e il livello di compatibilità del database locale di SQL Server 2008 è 90 viene restituito: |
Se il server remoto non è SQL Server e il livello di compatibilità del database locale di SQL Server 2008 è 100 viene restituito: |
---|---|---|---|---|
DBTYPE_DBTIMESTAMP senza dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
datetime (la colonna remota può essere datetime o smalldatetime) |
datetime (la colonna remota può essere datetime o smalldatetime) |
datetime |
datetime2(7) |
DBTYPE_DBTIMESTAMP con dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
datetime2 |
Non applicabile |
Non applicabile |
Non applicabile |
DBTYPE_DBDATE |
date |
Non applicabile |
datetime |
date |
DBTYPE_DBTIME |
time(0) |
Non applicabile |
datetime |
time(0) |
DBTYPE_DBTIME2 |
time(n) |
Non applicabile |
Non applicabile |
Non applicabile |
DBTYPE_DBTIMESTAMPOFFSET |
datetimeoffset |
Non applicabile |
Non applicabile |
Non applicabile |
Mapping SQL Server 2008 di data e ora inviate a un server remoto
Nella tabella seguente viene mostrato il mapping dei tipi di dati date e time inviati da un'istanza di SQL Server 2008 a una destinazione dati OLE DB. Questo conversione viene eseguita quando in SQL Server 2008 viene eseguita la scrittura dei dati, in genere tramite istruzioni INSERT o UPDATE, nell'origine dei dati OLE DB in cui la tabella modificata è una tabella remota.
Tipo di dati di SQL Server 2008 |
Se il server remoto è SQL Server 2008 viene associato a: |
Se il server remoto è SQL Server 2005 o SQL Server 2000 viene associato a: |
Se il server remoto non è SQL Server viene associato a: |
---|---|---|---|
datetime, smalldatetime |
DBTYPE_DBTIMESTAMP senza dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP senza dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP senza dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
datetime2(n) |
DBTYPE_DBTIMESTAMP con dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP senza dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP senza dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
date |
DBTYPE_DBDATE |
DBTYPE_DBDATE |
DBTYPE_DBDATE |
time(0) |
DBTYPE_DBTIME |
DBTYPE_DBTIME |
DBTYPE_DBTIME |
time(n) (0 < n <= 7) |
DBTYPE_DBTIMESTAMP (con parte relativa alla data in sospeso) con dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP senza dwFlags impostato come DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP (con parte relativa alla data in sospeso) |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
Non applicabile |
Non applicabile |
Esecuzione in SQL Server 2008 di query remote con i tipi di dati di data e ora
SQL Server 2008 esegue le query che fanno riferimento a oggetti remoti con tipi di dati time, date, datetime2 o datetimoffset nel server locale o nel server remoto. Ciò dipende dalla versione o dal provider del server remoto e dal tipo di riferimento. I tipi di riferimento considerati sono una colonna remota o una colonna costante, variabile o locale.
Provider non SQL Server
I tipi di dati time, date e datetime2 sono supportati in modo parziale se esistono tipi simili nel server remoto per provider non SQL Server. Questi provider non sono in grado di dichiarare il supporto per questi tipi.
Nella tabella seguente è indicato se una query viene eseguita nel server remoto o locale. Le prime colonne mostrano il tipo di dati nel server locale. La seconda colonna mostra il tipo di dati OLE DB corrispondente che l'istanza locale di SQL Server 2008 utilizza per il server remoto. Le ultime tre colonne mostrano se la query è eseguita nel server remoto o locale. Il percorso dell'esecuzione dipende dalla versione o dal tipo di server remoto.
Tipo di dati del server locale |
Tipo di dati OLE DB del server remoto utilizzato dal server SQL Server 2008 locale |
SQL Server 2008 o una versione successiva del server remoto |
Server remoto SQL Server 2005 |
Server remoto non MSSQL |
---|---|---|---|---|
datetime |
DBTYPE_DBTIMESTAMP |
Remoto |
Remoto |
Remoto |
smalldatetime |
DBTYPE_DBTIMESTAMP |
Remoto |
Remoto |
Remoto |
datetime2 |
DBTYPE_DBTIMESTAMP |
Remoto |
Locale |
Remoto |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
Remoto |
Locale |
Locale |
date |
DBTYPE_DBDATE |
Remoto |
Locale |
Remoto |
time(>0) |
DBTYPE_DBTIME2 |
Remoto |
Locale |
Locale |
time(0) |
DBTYPE_DBTIME2 |
Remoto |
Locale |
Remoto |
Vedere anche