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 |
Voir aussi