Mapping dei tipi di dati con le query distribuite
Un provider OLE DB espone i tipi di dati utilizzando gli 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 tra il provider OLE DB e 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 da una semplice regola, in base alla quale il valore di una colonna remota è valido in un'espressione Transact-SQL se nello stesso contesto è valido anche il tipo di dati di SQL Server corrispondente definito nella tabella del mapping dei tipi di dati.
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 Server data_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 |
datetime |
|
DBTYPE_DBDATE |
datetime (Il livello di compatibilità è inferiore a 9.0) |
|
DBTYPE_DBTIME |
datetime |
|
DBTYPE_DBTIMESTAMP |
datetime |
|
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 Server numeric 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 Server S1 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 Server S2 e il mapping tra S2 e T è definito nella tabella del mapping dei tipi di dati.
Vedere anche
Concetti
Linee guida per l'utilizzo di query distribuite
Query distribuite