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