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çã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 |
Consulte também