Asignación de tipos de datos con consultas distribuidas
Un proveedor OLE DB expone los tipos de datos de sus datos de acuerdo con los identificadores de tipos OLE DB denominados DBTYPE. Los tipos de datos OLE DB se convierten a tipos de datos del sistema de SQL Server, y viceversa, mediante las siguientes asignaciones de datos:
De tipos de datos OLE DB a tipos de datos del sistema de SQL Server. Esta conversión se produce cuando SQL Server lee los datos del origen de datos OLE DB, ya sea en instrucciones SELECT o en la fase de lectura de las instrucciones UPDATE, INSERT o DELETE.
De tipos de datos del sistema de SQL Server a tipos de datos OLE DB. Esta conversión se produce cuando SQL Server escribe datos, normalmente en instrucciones INSERT o UPDATE, en el origen de datos OLE DB donde la tabla modificada es una tabla remota.
Asignación de tipos de datos del proveedor OLE DB a tipos de datos de SQL Server
La asignación de tipos de datos del proveedor OLE DB a SQL Server define las comparaciones y expresiones permitidas, y las conversiones explícitas válidas que implican el uso de datos remotos. La asignación se muestra en la tabla siguiente.
La validez de los tipos de columnas de tablas remotas en las expresiones se puede resumir con la siguiente regla: un valor de columna remota es válido en una expresión Transact-SQL si el tipo de datos de SQL Server correspondiente de la tabla de asignación de tipos de datos es válido en el mismo contexto.
Considere, por ejemplo, la expresión: local_column OPERATOR remote_column. En esta expresión*,* local_column es una columna de tabla local y remote_column es una columna de tabla remota. La expresión es válida si OPERATOR es un operador válido para el tipo de datos de la columna local y para el tipo de datos al que se asigna el valor DBTYPE de remote_column.
De forma similar, CAST(remote_column AS data_type_1) se permite si el valor DBTYPE de remote_column se asigna al tipo de datos del sistema data_type_2 de SQL Server y se admite la conversión explícita de data_type_2 a data_type_1. Por ejemplo, una columna del tipo de datos DBTYPE_DATE del proveedor se puede convertir en una columna datetime de SQL Server. Sin embargo, los datos DBTYPE_DATE no se pueden convertir directamente en varchar.
A continuación, se muestra la tabla de asignación de tipos de datos. Utilice el indicador DBTYPE y el valor DBCOLUMNFLAGS de una columna para encontrar el tipo de datos correspondiente de SQL Server.
DBTYPE |
DBCOLUMNFLAGS |
Tipo de datos de 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 |
Error |
|
DBTYPE_ERROR |
Error |
|
DBTYPE_BOOL |
bit |
|
DBTYPE_VARIANT |
nvarchar(4000) |
|
DBTYPE_IUNKNOWN |
Error |
|
DBTYPE_GUID |
uniqueidentifier |
|
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISLONG = true o el tamaño máximo de columna es > 8.000 bytes. |
image |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISLONG = true y el tamaño de columna tiene una longitud ilimitada. |
varbinary(max) |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISROWVER = true, DBCOLUMNFLAGS_ISFIXEDLENGTH = true y el tamaño de columna = 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 el tamaño máximo de columna es > 8.000 caracteres. |
text |
DBTYPE_STR |
DBCOLUMNFLAGS_ISLONG = true y el tamaño de columna tiene una longitud ilimitada. |
varchar(max) |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISFIXED |
nchar |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
nvarchar |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISLONG = true o el tamaño máximo de columna es > 4.000 caracteres. |
ntext |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISLONG = true y el tamaño de columna tiene una longitud ilimitada. |
nvarchar(max) |
DBTYPE_UDT |
Tipo equivalente de SQL Server definido por el usuario, si está registrado. |
|
DBTYPE_DATE |
date, datetime, datetime2, datetimeoffset |
|
DBTYPE_DBDATE |
date, datetime, datetime2, datetimeoffset (el nivel de compatibilidad es menor que 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 |
Error |
|
DBTYPE_BYREF |
Se omite |
|
DBTYPE_VECTOR |
Error |
|
DBTYPE_RESERVED |
Error |
|
DBTYPE_XML |
xml (se admite sólo en consultas de paso a través) |
1numeric(p,s) indica el tipo de datos numeric de SQL Server, con precisión p y escala s.
[!NOTA]
Si es necesario convertir los datos en un tipo de datos de SQL Server distinto del valor predeterminado que se muestra, se deberá realizar una conversión explícita con la función CAST o CONVERT. Para obtener más información, vea CAST y CONVERT (Transact-SQL).
La información del indicador DBTYPE y del valor DBCOLUMNFLAGS se obtiene del proveedor, a través del conjunto de filas del esquema COLUMNS o a través de la interfaz IColumnsInfo. Para el conjunto de filas del esquema COLUMNS, las columnas DATA_TYPE y COLUMN_FLAGS representan los valores DBTYPE y DBCOLUMNFLAGS. Para la interfaz IColumnsInfo::GetColumnInfo, los miembros wType y dwFlags de la estructura DBCOLUMNINFO representan estos valores.
Asignación de tipos de datos desde SQL Server al proveedor OLE DB
Los tipos de datos del sistema de SQL Server se asignan a los tipos OLE DB como se indicaba en la tabla anterior. Se puede asignar un tipo S1 de SQL Server a un tipo T determinado de OLE DB siempre que se cumpla alguna de estas condiciones:
En la tabla de asignación de tipos de datos se puede encontrar la asignación correspondiente.
Existe una conversión implícita permitida del tipo de datos S1 en otro tipo de datos (S2) de SQL Server, y se define una asignación de S2 a T en la tabla de asignación de tipos de datos.
Asignación de SQL Server 2008 de fecha y fecha de recepción de un servidor remoto
La tabla siguiente muestra date y asignación de tipo de datos time para los datos enviados de un origen de datos OLE DB a una instancia de SQL Server 2008. Esta conversión se produce cuando SQL Server 2008 lee los datos del origen de datos OLE DB, ya sea en instrucciones SELECT o en la fase de lectura de las instrucciones UPDATE, INSERT o DELETE. Si una columna remota es de un tipo de datos date, time, dateime2 o datetimeoffset se devuelve dicho tipo si el nivel de compatibilidad de la base de datos es 100 o superior. Si el nivel de compatibilidad es más bajo, SQL Server 2008 realiza una conversión implícita a datetime.
Tipo OLE DB |
Si el servidor remoto es SQL Server 2008 devuelve: |
Si el servidor remoto es SQL Server 2005 o SQL Server 2000 devuelve: |
Si el servidor remoto no es SQL Server y el nivel de compatibilidad de la base de datos de SQL Server 2008 local es 90 devuelve: |
Si el servidor remoto no es SQL Server y el nivel de compatibilidad de la base de datos de SQL Server 2008 local es 100 devuelve: |
---|---|---|---|---|
DBTYPE_DBTIMESTAMP sin dwFlags que se establece como DBPARAMFLAGS_SS_ISVARIABLESCALE |
datetime (la columna remota podría ser datetime o smalldatetime) |
datetime (la columna remota podría ser datetime o smalldatetime) |
datetime |
datetime2(7) |
DBTYPE_DBTIMESTAMP con dwFlags que se establece como DBPARAMFLAGS_SS_ISVARIABLESCALE |
datetime2 |
No aplicable |
No aplicable |
No aplicable |
DBTYPE_DBDATE |
date |
No aplicable |
datetime |
date |
DBTYPE_DBTIME |
time(0) |
No aplicable |
datetime |
time(0) |
DBTYPE_DBTIME2 |
time(n) |
No aplicable |
No aplicable |
No aplicable |
DBTYPE_DBTIMESTAMPOFFSET |
datetimeoffset |
No aplicable |
No aplicable |
No aplicable |
Asignación de SQL Server 2008 de fecha y hora enviada a un servidor remoto
La tabla siguiente muestra date y asignación de tipo de datos time de los datos enviados de una instancia de SQL Server 2008 a un destino de datos OLE DB. Esta conversión se produce cuando SQL Server 2008 escribe datos, normalmente en instrucciones INSERT o UPDATE, en el origen de datos OLE DB donde la tabla modificada es una tabla remota.
Tipo de datos de SQL Server 2008 |
Si el servidor remoto es SQL Server 2008 enlaza con: |
Si el servidor remoto es SQL Server 2005 o SQL Server 2000 enlaza con: |
Si el servidor remoto no es ningún enlace de SQL Server enlaza con: |
---|---|---|---|
datetime, smalldatetime |
DBTYPE_DBTIMESTAMP sin dwFlags que se establece como DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP sin dwFlags que se establece como DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP sin dwFlags que se establece como DBPARAMFLAGS_SS_ISVARIABLESCALE |
datetime2(n) |
DBTYPE_DBTIMESTAMP con dwFlags que se establece como DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP sin dwFlags que se establece como DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP sin dwFlags que se establece como 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 la parte de fecha pendiente) con dwFlags que se está estableciendo como DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP sin dwFlags que se establece como DBPARAMFLAGS_SS_ISVARIABLESCALE |
DBTYPE_DBTIMESTAMP (con la parte de fecha pendiente) |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
No aplicable |
No aplicable |
Ejecución de consulta remota de SQL Server 2008 con los tipos de datos de fecha y hora
SQL Server 2008 ejecuta consultas que hacen referencia a los objetos remotos que tienen los tipos de datos time, date, datetime2 o datetimoffset, en el servidor local o remoto. La decisión depende de la versión o proveedor del servidor remoto y del tipo de referencia. Los tipos de referencia considerados son una columna remota o una constante, variable o columna local.
Proveedores que no son SQL Server
La compatibilidad es parcial para los tipos de datos time, date y datetime2 cuando existen tipos similares en el servidor remoto para proveedores que no son de SQL Server. Estos proveedores no tienen ninguna manera de declarar su compatibilidad para estos tipos.
La tabla siguiente muestra si una consulta se ejecuta en el servidor remoto o local. Las primeras columnas muestran el tipo de datos del servidor local. La segunda columna muestra el tipo de datos OLE DB correspondiente que la instancia local de SQL Server 2008 usa para el servidor remoto. Las últimas tres columnas muestran si la consulta se ejecuta en el servidor remoto o en el servidor local. La ubicación de la ejecución depende de la versión o del tipo del servidor remoto.
Tipo de datos del servidor local |
Tipo de datos OLE DB del servidor remoto que se usa por SQL Server 2008 local |
SQL Server 2008 o una versión posterior del servidor remoto |
Servidor remoto de SQL Server 2005 |
Servidor remoto que no es de MSSQL |
---|---|---|---|---|
datetime |
DBTYPE_DBTIMESTAMP |
Remoto |
Remoto |
Remoto |
smalldatetime |
DBTYPE_DBTIMESTAMP |
Remoto |
Remoto |
Remoto |
datetime2 |
DBTYPE_DBTIMESTAMP |
Remoto |
Local |
Remoto |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
Remoto |
Local |
Local |
date |
DBTYPE_DBDATE |
Remoto |
Local |
Remoto |
time(>0) |
DBTYPE_DBTIME2 |
Remoto |
Local |
Local |
time(0) |
DBTYPE_DBTIME2 |
Remoto |
Local |
Remoto |
Vea también