Mappage des types de données à l'aide des requêtes distribuées

Un fournisseur OLE DB présente les types de ses données en fonction d'identificateurs de type OLE DB appelés DBTYPE. Les types de données sont convertis entre les types de données OLE DB et les types de données système SQL Server en mappant les données :

  • Des types de données OLE DB aux types de données système SQL Server. Cette conversion a lieu lorsque SQL Server lit les données à partir de la source de données OLE DB, dans des instructions SELECT ou dans des instructions UPDATE, INSERT ou DELETE.

  • Des types de données système SQL Server aux types de données OLE DB. Cette conversion a lieu lorsque SQL Server écrit des données, principalement dans des instructions INSERT et UPDATE, dans la source de données OLE DB dans laquelle la table modifiée est une table distante.

Mappage des types de données du fournisseur OLE DB vers SQL Server

Ce mappage de types de données du fournisseur OLE DB vers SQL Server définit les comparaisons et les expressions autorisées, ainsi que les conversions explicites valides qui impliquent des données distantes. Le mappage est présenté dans le tableau ci-dessous.

La validité des types des colonnes des tables distantes dans les expressions peut être résumée par la règle suivante : la valeur d'une colonne distante est valide dans une expression Transact-SQL si le type de données SQL Server mappé correspondant, répertorié dans le tableau Mappage des types de données, est valide dans le même contexte.

Par exemple, considérons l'expression suivante : local_column OPERATOR remote_column. Dans cette expression*,* local_column est une colonne de table locale et remote_column est une colonne de table distante. L'expression est valide si OPERATOR est un opérateur valide pour le type de données de la colonne locale et pour le type de données sur lequel l'indicateur DBTYPE de remote_column est mappé.

De même, CAST(remote_column AS data_type_1) est autorisé si l'indicateur DBTYPE de remote_column est mappé sur le type de données système SQL Serverdata_type_2 et si la conversion explicite de data_type_2 vers data_type_1 est autorisée. Par exemple, une colonne de type de données DBTYPE_DATE côté fournisseur peut être convertie en colonne datetime dans SQL Server. Cependant, les données DBTYPE_DATE ne peuvent pas être converties directement en varchar.

Le tableau ci-dessous correspond au tableau de mappage des types de données. En utilisant l'indicateur DBTYPE et sa valeur DBCOLUMNFLAGS pour une colonne, vous pouvez connaître le type de données SQL Server correspondant.

DBTYPE

DBCOLUMNFLAGS

Type de données 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

Erreur

DBTYPE_ERROR

Erreur

DBTYPE_BOOL

bit

DBTYPE_VARIANT

nvarchar(4000)

DBTYPE_IUNKNOWN

Erreur

DBTYPE_GUID

uniqueidentifier

DBTYPE_BYTES

DBCOLUMNFLAGS_ISLONG = true ou taille maximale de colonne > 8 000 octets

image

DBTYPE_BYTES

DBCOLUMNFLAGS_ISLONG = true et la taille de colonne a une longueur illimitée.

varbinary(max)

DBTYPE_BYTES

DBCOLUMNFLAGS_ISROWVER = true, DBCOLUMNFLAGS_ISFIXEDLENGTH = true et taille de colonne = 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 ou taille maximale de colonne > 8 000 caractères.

text

DBTYPE_STR

DBCOLUMNFLAGS_ISLONG = true et la taille de colonne a une longueur illimitée.

varchar(max)

DBTYPE_WSTR

DBCOLUMNFLAGS_ISFIXED

nchar

DBTYPE_WSTR

DBCOLUMNFLAGS_ISFIXEDLENGTH = false

nvarchar

DBTYPE_WSTR

DBCOLUMNFLAGS_ISLONG = true ou taille maximale de colonne > 4,000 caractères.

ntext

DBTYPE_WSTR

DBCOLUMNFLAGS_ISLONG = true et la taille de colonne a une longueur illimitée.

nvarchar(max)

DBTYPE_UDT

Type SQL Server équivalent défini par l'utilisateur, s'il en existe un d'inscrit.

DBTYPE_DATE

date, datetime, datetime2, datetimeoffset

DBTYPE_DBDATE

date, datetime, datetime2, datetimeoffset (Niveau de compatibilité inférieur à 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

Erreur

DBTYPE_BYREF

Ignoré

DBTYPE_VECTOR

Erreur

DBTYPE_RESERVED

Erreur

DBTYPE_XML

xml (Autorisé uniquement dans les requêtes pass-through).

1numeric(p,s) indique un type de données SQL Servernumeric avec une précision p et une échelle s.

Notes

Si des données doivent être converties dans un type de données SQL Server différent du type par défaut indiqué dans le tableau ci-dessus, il est nécessaire d'effectuer une conversion explicite à l'aide de la fonction CAST ou CONVERT. Pour plus d'informations, consultez CAST et CONVERT (Transact-SQL).

Les données de l'indicateur DBTYPE et de la valeur DBCOLUMNFLAGS sont transmises par le fournisseur par l'intermédiaire de l'ensemble de lignes du schéma COLUMNS ou de l'interface IColumnsInfo. Pour l'ensemble de lignes du schéma COLUMNS, les colonnes DATA_TYPE et COLUMN_FLAGS représentent les valeurs DBTYPE et DBCOLUMNFLAGS. Pour l'interface IColumnsInfo::GetColumnInfo, les membres wType et dwFlags de la structure DBCOLUMNINFO représentent ces valeurs.

Mappage des types de données de SQL Server vers le fournisseur OLE DB

Les types de données système SQL Server sont mappés sur les types OLE DB à l'aide du mappage présenté dans le tableau précédent. Le mappage d'un type SQL ServerS1 sur un type OLE/DB T spécifique est autorisé si l'une des conditions suivantes est respectée :

  • Le mappage correspondant figure dans le tableau de mappage des types de données.

  • Il existe une conversion implicite autorisée du type de données S1 vers un autre type de données SQL ServerS2 et un mappage de S2 sur T est défini dans le tableau de mappage des types de données.

Mappage SQL Server 2008 de données de date et heure reçues depuis un serveur distant

Le tableau suivant indique le mappage de type de données date et time pour les données envoyées depuis une source de données OLE DB vers une instance de SQL Server 2008. Cette conversion a lieu lorsque SQL Server 2008 lit les données à partir de la source de données OLE DB, dans des instructions SELECT ou dans des instructions UPDATE, INSERT ou DELETE. Si une colonne distante est d'un type de données date, time, dateime2 ou datetimeoffset, ce type est retourné si le niveau de compatibilité de la base de données est supérieur ou égal à 100. Si le niveau de compatibilité est inférieur, SQL Server 2008 effectue une conversion implicite vers datetime.

Type OLE DB

Si le serveur distant est SQL Server 2008

retourne :

Si le serveur distant est SQL Server 2005 ou SQL Server 2000, retourne :

Si le serveur distant n'est pas SQL Server et que le niveau de compatibilité de la base de données SQL Server 2008 locale est 90, retourne :

Si le serveur distant n'est pas SQL Server et que le niveau de compatibilité de la base de données SQL Server 2008 locale est 100, retourne :

DBTYPE_DBTIMESTAMP sans dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

datetime (la colonne distante pourrait être datetime ou smalldatetime)

datetime (la colonne distante pourrait être datetime ou smalldatetime)

datetime

datetime2(7)

DBTYPE_DBTIMESTAMP avec dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

datetime2

Non applicable

Non applicable

Non applicable

DBTYPE_DBDATE

date

Non applicable

datetime

date

DBTYPE_DBTIME

time(0)

Non applicable

datetime

time(0)

DBTYPE_DBTIME2

time(n)

Non applicable

Non applicable

Non applicable

DBTYPE_DBTIMESTAMPOFFSET

datetimeoffset

Non applicable

Non applicable

Non applicable

Mappage SQL Server 2008 de données de date et heure envoyées vers un serveur distant

Le tableau suivant indique le mappage de type de données date et time pour les données envoyées depuis une instance de SQL Server 2008 vers une destination de données OLE DB. Cette conversion a lieu lorsque SQL Server 2008 écrit des données, principalement dans des instructions INSERT et UPDATE, dans la source de données OLE DB dans laquelle la table modifiée est une table distante.

Type de données de SQL Server 2008

Si le serveur distant est SQL Server 2008

liaison avec :

Si le serveur distant est SQL Server 2005 ou SQL Server 2000, liaison avec :

Si le serveur distant n'est pas SQL Server, liaison avec :

datetime, smalldatetime

DBTYPE_DBTIMESTAMP sans dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sans dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sans dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

datetime2(n)

DBTYPE_DBTIMESTAMP avec dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sans dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sans dwFlags défini comme 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 (avec partie de date en attente)

avec dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sans dwFlags défini comme DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP (avec partie de date en attente)

datetimeoffset

DBTYPE_DBTIMESTAMPOFFSET

Non applicable

Non applicable

Exécution de requête distante SQL Server 2008 avec types de données de date et heure

SQL Server 2008 exécute des requêtes qui font référence à des objets distants ayant les types de données time, date, datetime2 ou datetimoffset , sur le serveur local ou distant. La décision dépend de la version ou du fournisseur du serveur distant et du type de référence. Les types référence considérés sont une colonne distante ou une colonne constante, variable ou locale.

Fournisseurs non-SQL Server

La prise en charge est partielle pour les types de données time, date et datetime2 lorsque des types semblables existent sur le serveur distant pour des fournisseurs non-SQL Server. Ces fournisseurs ne sont pas en mesure de déclarer leur prise en charge pour ces types.

Le tableau suivant indique si une requête est exécutée sur le serveur distant ou local. Les premières colonnes indiquent le type de données sur le serveur local. La deuxième colonne indique le type de données OLE DB correspondant utilisé par l'instance locale de SQL Server 2008 pour le serveur distant. Les trois dernières colonnes indiquent si la requête est exécutée sur le serveur distant ou local. L'emplacement d'exécution dépend de la version ou du type du serveur distant.

Type de données de serveur local

Type de données OLE DB de serveur distant utilisé par le SQL Server 2008 local

Serveur distant SQL Server 2008 ou version ultérieure

Serveur distant SQL Server 2005

Serveur distant non-MSSQL

datetime

DBTYPE_DBTIMESTAMP

Distant

Distant

Distant

smalldatetime

DBTYPE_DBTIMESTAMP

Distant

Distant

Distant

datetime2

DBTYPE_DBTIMESTAMP

Distant

Local

Distant

datetimeoffset

DBTYPE_DBTIMESTAMPOFFSET

Distant

Local

Local

date

DBTYPE_DBDATE

Distant

Local

Distant

time(>0)

DBTYPE_DBTIME2

Distant

Local

Local

time(0)

DBTYPE_DBTIME2

Distant

Local

Distant