Partilhar via


Mapeamento de tipo de dados com consultas distribuídas

Um provedor OLE DB expõe os tipos de dados de acordo com identificadores de tipo OLE DB chamados DBTYPEs. Os tipos de dados são convertidos entre tipos de dados do OLE DB e tipos de dados do sistema SQL Server por meio do mapeamento de dados:

  • De tipos de dados do OLE DB em tipos de dados do sistema SQL Server. Essa conversão ocorre quando o SQL Server lê dados da fonte de dados do OLE DB, em instruções SELECT ou no lado de leitura das instruções UPDATE, INSERT ou DELETE.

  • De tipos de dados do SQL Server em tipos de dados do OLE DB. Essa conversão ocorre quando o SQL Server grava dados, principalmente em instruções INSERT ou UPDATE, na fonte de dados do OLE DB na qual a tabela modificada é uma tabela remota.

Mapeamento de tipo de dados do provedor OLE DB para SQL Server

O mapeamento de tipo de dados do provedor OLE DB para o SQL Server define comparações e expressões permitidas e as conversões explícitas válidas que envolvem dados remotos. O mapeamento é mostrado na tabela a seguir.

A validade do tipo para colunas de tabelas remotas em expressões pode ser resumida pela seguinte regra: um valor de coluna remota será válido na expressão Transact-SQL se o tipo de dados mapeado correspondente do SQL Server na tabela Mapeamento de Tipo de Dados for válido no mesmo contexto.

Por exemplo, considere a expressão: coluna_localOPERADOR coluna_remota. Nessa expressão , coluna_local é uma coluna de uma tabela local e coluna_remota é uma coluna de uma tabela remota. A expressão será válida se OPERADOR for um operador válido para o tipo de dados da coluna local e para o tipo de dados para o qual o DBTYPE da coluna_remota é mapeado.

De maneira semelhante, CAST(remote_column AS data_type_1) será permitido se o DBTYPE da coluna_remota for mapeado para o tipo de dados data_type_2 do sistema SQL Server e conversão explícita do data_type_2 em data_type_1 for permitida. Por exemplo, uma coluna de tipo de dados DBTYPE_DATE no lado do provedor pode ser convertida em uma coluna datetime no SQL Server. No entanto os dados de DBTYPE_DATE não podem ser convertidos diretamente em varchar.

A tabela a seguir mostra a tabela de mapeamento de tipo de dados. Usando o indicador DBTYPE e seu valor DBCOLUMNFLAGS de uma coluna, é possível localizar o tipo de dados correspondente do SQL Server.

DBTYPE

DBCOLUMNFLAGS

Tipos de dados do 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 = verdadeiro

ntext

DBTYPE_BSTR

DBCOLUMNFLAGS_ISFIXEDLENGTH = verdadeiro

nchar

DBTYPE_BSTR

DBCOLUMNFLAGS_ISFIXEDLENGTH = falso

nvarchar

DBTYPE_IDISPATCH

Erro

DBTYPE_ERROR

Erro

DBTYPE_BOOL

bit

DBTYPE_VARIANT

nvarchar(4000)

DBTYPE_IUNKNOWN

Erro

DBTYPE_GUID

uniqueidentifier

DBTYPE_BYTES

DBCOLUMNFLAGS_ISLONG = verdadeiro ou tamanho máximo da coluna > 8.000 bytes.

image

DBTYPE_BYTES

DBCOLUMNFLAGS_ISLONG = verdadeiro e tamanho da coluna de tamanho ilimitado.

varbinary(max)

DBTYPE_BYTES

DBCOLUMNFLAGS_ISROWVER = verdadeiro, DBCOLUMNFLAGS_ISFIXEDLENGTH = verdadeiro e tamanho da coluna = 8

timestamp

DBTYPE_BYTES

DBCOLUMNFLAGS_ISFIXEDLENGTH = verdadeiro

binary

DBTYPE_BYTES

DBCOLUMNFLAGS_ISFIXEDLENGTH = falso

varbinary

DBTYPE_STR

DBCOLUMNFLAGS_ISFIXEDLENGTH = verdadeiro

char

DBTYPE_ STR

DBCOLUMNFLAGS_ISFIXEDLENGTH = falso

varchar

DBTYPE_STR

DBCOLUMNFLAGS_ISLONG = verdadeiro ou tamanho máximo coluna > 8.000 caracteres.

text

DBTYPE_STR

DBCOLUMNFLAGS_ISLONG = verdadeiro e tamanho da coluna de comprimento ilimitado.

varchar(max)

DBTYPE_WSTR

DBCOLUMNFLAGS_ISFIXED

nchar

DBTYPE_WSTR

DBCOLUMNFLAGS_ISFIXEDLENGTH = falso

nvarchar

DBTYPE_WSTR

DBCOLUMNFLAGS_ISLONG = verdadeiro ou tamanho máximo coluna > 4.000 caracteres.

ntext

DBTYPE_WSTR

DBCOLUMNFLAGS_ISLONG = verdadeiro e tamanho coluna de comprimento ilimitado.

nvarchar(max)

DBTYPE_UDT

Tipo definido pelo usuário equivalente ao SQL Server, se houver um registrado.

DBTYPE_DATE

date, datetime, datetime2, datetimeoffset

DBTYPE_DBDATE

date, datetime, datetime2, datetimeoffset (O nível de compatibilidade é menor do 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

Erro

DBTYPE_BYREF

Ignorado

DBTYPE_VECTOR

Erro

DBTYPE_RESERVED

Erro

DBTYPE_XML

xml (Permitido apenas em consultas passagem).

1numeric(p,s) indica o tipo de dados numeric do SQL Server com precisão p e escala s.

ObservaçãoObservação

Se os dados devem ser convertidos em um tipo de dados do SQL Server que seja diferente do padrão mostrado, uma conversão explícita, usando a função CAST ou CONVERT, será necessária. Para obter mais informações, consulte CAST e CONVERT (Transact-SQL).

As informações do indicador de DBTYPE e o valor de DBCOLUMNFLAGS são provenientes do provedor por meio do conjunto de linhas de esquema COLUMNS ou por meio da interface IColumnsInfo. Para o conjunto de linhas de esquema COLUMNS, as colunas DATA_TYPE e COLUMN_FLAGS representam os valores de DBTYPE e DBCOLUMNFLAGS. Para a interface IColumnsInfo::GetColumnInfo, os membros wType e dwFlags da estrutura DBCOLUMNINFO representam esses valores.

Mapeamento de tipo de dados do SQL Server para o Provedor OLE DB

Tipos de dados do sistema SQL Server são mapeados para tipos do OLE DB usando o mapeamento mostrado na tabela anterior. Um mapeamento de um tipo S1 do SQL Server para um tipo T específico do OLE DB será permitido se uma das seguintes condições for verdadeira:

  • O mapeamento correspondente pode ser localizado na tabela de mapeamento de tipo de dados.

  • Há uma conversão implícita permitida do tipo de dados S1 em outro tipo de dados S2 do SQL Server e um mapeamento de S2 para T está definido na tabela de mapeamento de tipo de dados.

Mapeamento de data e hora do SQL Server 2008 recebido de um servidor remoto

A tabela a seguir mostra o mapeamento de tipo de dados de date e time de dados enviados de uma fonte de dados OLE DB para uma instância do SQL Server 2008. Essa conversão ocorre quando o SQL Server 2008 lê dados da fonte de dados OLE DB, em instruções SELECT ou no lado de leitura das instruções UPDATE, INSERT ou DELETE. Se uma coluna remota for de um tipo de dados date, time, dateime2 ou datetimeoffset, esse tipo será retornado se o nível de compatibilidade do banco de dados for 100 ou superior. Se o nível de compatibilidade for inferior, o SQL Server 2008 fará uma conversão implícita em datetime.

Tipo do OLE DB

Se o servidor remoto for SQL Server 2008,

retornar:

Se o servidor remoto for SQL Server 2005 ou SQL Server 2000, retornar:

Se o servidor remoto não for o SQL Server e o nível de compatibilidade do banco de dados SQL Server 2008 local for 90, retornar:

Se o servidor remoto não for um SQL Server e o nível de compatibilidade do banco de dados SQL Server 2008 for 100, retornar:

DBTYPE_DBTIMESTAMP sem dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

datetime (coluna remota pode ser datetime ou smalldatetime)

datetime (coluna remota pode ser datetime ou smalldatetime)

datetime

datetime2(7)

DBTYPE_DBTIMESTAMP com dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

datetime2

Não aplicável

Não aplicável

Não aplicável

DBTYPE_DBDATE

date

Não aplicável

datetime

date

DBTYPE_DBTIME

time(0)

Não aplicável

datetime

time(0)

DBTYPE_DBTIME2

time(n)

Não aplicável

Não aplicável

Não aplicável

DBTYPE_DBTIMESTAMPOFFSET

datetimeoffset

Não aplicável

Não aplicável

Não aplicável

Mapeamento de data e hora do SQL Server 2008 enviado para um servidor remoto

A tabela a seguir mostra o mapeamento de tipo date e time de dados enviados de uma instância do SQL Server 2008 a um destino de dados OLE DB. Essa conversão ocorre quando o SQL Server 2008 grava dados, principalmente em instruções INSERT ou UPDATE, na fonte de dados OLE DB na qual a tabela modificada é uma tabela remota.

Tipos de dados do SQL Server 2008

Se o servidor remoto for SQL Server 2008,

associar a:

Se o servidor remoto for um SQL Server 2005 ou SQL Server 2000, associar a:

Se o servidor remoto não for SQL Server, associar a:

datetime, smalldatetime

DBTYPE_DBTIMESTAMP sem dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sem dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sem dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

datetime2(n)

DBTYPE_DBTIMESTAMP com dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sem dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sem dwFlags sendo definido 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 (com parte de data pendente)

com dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP sem dwFlags sendo definido como DBPARAMFLAGS_SS_ISVARIABLESCALE

DBTYPE_DBTIMESTAMP (com parte da data pendente)

datetimeoffset

DBTYPE_DBTIMESTAMPOFFSET

Não aplicável

Não aplicável

Execução de consulta remota do SQL Server 2008 com tipos de dados date e time

O SQL Server 2008 executa consultas que fazem referência a objetos remotos que têm tipos de dados time, date, datetime2 ou datetimoffset no servidor local ou remoto. A decisão depende da versão ou do provedor do servidor remoto e do tipo de referência. Os tipos de referência considerados são uma coluna remota ou uma coluna constante, variável ou local.

Provedores não-SQL Server

O suporte é parcial para tipos de dados time, date e datetime2 quando existem tipos semelhantes no servidor remoto para provedores não-SQL Server. Esses provedores não têm como declarar suporte para esses tipos.

A tabela a seguir mostra se uma consulta é executada no servidor remoto ou local. As primeiras colunas mostram o tipo de dados no servidor local. A segunda coluna mostra o tipo de dados OLE DB correspondentes que a instância local do SQL Server 2008 usa para o servidor remoto. As últimas três colunas mostram se a consulta é executada no servidor remoto ou local. O local da execução depende da versão ou do tipo do servidor remoto.

Tipo de dados do servidor local

O tipo de dados OLE DB do servidor remoto que é usado pelo SQL Server 2008 local

SQL Server 2008 ou uma versão posterior do servidor remoto

Servidor SQL Server 2005 remoto

Servidor remoto do não-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