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