Partilhar via


Novos recursos de data e hora com versões anteriores do SQL Server (OLE DB)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure do Azure Synapse AnalyticsAnalytics Platform System (PDW)

Este tópico descreve o comportamento esperado quando um aplicativo cliente que usa recursos avançados de data e hora se comunica com uma versão do SQL Server anterior ao SQL Server 2008 (10.0.x) e quando um cliente compilado com uma versão do SQL Server Native Client anterior ao SQL Server 2008 (10.0.x) envia comandos para um servidor que oferece suporte a recursos avançados de data e hora.

Down-Level Comportamento do Cliente

Os aplicativos cliente que usam uma versão do SQL Server Native Client anterior ao SQL Server 2008 (10.0.x) veem os novos tipos de data/hora como colunas nvarchar. O conteúdo da coluna são representações literais. Para obter mais informações, consulte a seção "Formatos de dados: cadeias de caracteres e literais" de Suporte a tipos de dados para melhorias de data e hora do OLE DB. O tamanho da coluna é o comprimento literal máximo para a precisão especificada para a coluna.

As APIs de catálogo retornarão metadados consistentes com o código de tipo de dados de nível inferior retornado ao cliente (por exemplo, nvarchar) e a representação de nível inferior associada (por exemplo, o formato literal apropriado). No entanto, o nome do tipo de dados retornado será o nome do tipo real do SQL Server 2008 (10.0.x).

Quando um aplicativo cliente de nível inferior é executado em um servidor SQL Server 2008 (10.0.x) (ou posterior) no qual foram feitas alterações de esquema para tipos de data/hora, o comportamento esperado é o seguinte:

Tipo de cliente OLE DB Tipo do SQL Server 2005 Tipo do SQL Server 2008 (ou posterior) Conversão de resultados (servidor para cliente) Conversão de parâmetros (cliente para servidor)
DBTYPE_DBDATE Data/hora Data OK OK
DBTYPE_DBTIMESTAMP Campos de tempo definidos como zero. IRowsetChange falhará devido ao truncamento da cadeia de caracteres se o campo de tempo for diferente de zero.
DBTYPE_DBTIME Tempo(0) OK OK
DBTYPE_DBTIMESTAMP Campos de data definidos para a data atual. IRowsetChange falhará devido ao truncamento da cadeia de caracteres se os segundos fracionários forem diferentes de zero.

A data é ignorada.
DBTYPE_DBTIME Tempo(7) Falha - literal de tempo inválido. OK
DBTYPE_DBTIMESTAMP Falha - literal de tempo inválido. OK
DBTYPE_DBTIMESTAMP Data/hora2(3) OK OK
DBTYPE_DBTIMESTAMP Data/hora2(7) OK OK
DBTYPE_DBDATE Pequenodatetime Data OK OK
DBTYPE_DBTIMESTAMP Campos de tempo definidos como zero. IRowsetChange falhará devido ao truncamento de cadeia de caracteres se o campo de tempo for diferente de zero.
DBTYPE_DBTIME Tempo(0) OK OK
DBTYPE_DBTIMESTAMP Campos de data definidos para a data atual. IRowsetChange falhará devido ao truncamento da cadeia de caracteres se os segundos fracionários forem diferentes de zero.

A data é ignorada.
DBTYPE_DBTIMESTAMP Data/hora2(0) OK OK

OK significa que, se funcionou com o SQL Server 2005 (9.x), deve continuar a trabalhar com o SQL Server 2008 (10.0.x) (ou posterior).

Apenas as seguintes alterações de esquema comuns foram consideradas:

  • Usando um novo tipo onde logicamente um aplicativo requer apenas um valor de data ou hora. No entanto, o aplicativo foi forçado a usar datetime ou smalldatetime porque tipos separados de data e hora não estavam disponíveis.

  • Usando um novo tipo para obter precisão ou precisão adicional de segundos fracionários.

  • Mudar para datetime2 porque este é o tipo de dados preferido para data e hora.

Os aplicativos que usam metadados de servidor obtidos por meio de ICommandWithParameters::GetParameterInfo ou conjuntos de linhas de esquema para definir informações de tipo de parâmetro por meio de ICommandWithParameters::SetParameterInfo falharão durante conversões de cliente em que a representação de cadeia de caracteres de um tipo de origem é maior do que a representação de cadeia de caracteres do tipo de destino. Por exemplo, se uma associação de cliente usar DBTYPE_DBTIMESTAMP e a coluna do servidor for data, o SQL Server Native Client converterá o valor em "aaaa-dd-mm hh:mm:ss.fff", mas os metadados do servidor serão retornados como nvarchar(10). O transbordamento resultante causa DBSTATUS_E_CANTCONVERTVALUE. Problemas semelhantes surgem com conversões de dados por IRowsetChange, porque os metadados do conjunto de linhas são definidos a partir dos metadados do conjunto de resultados.

Metadados de parâmetros e conjuntos de linhas

Esta seção descreve metadados para parâmetros, colunas de resultados e conjuntos de linhas de esquema para clientes compilados com uma versão do SQL Server Native Client anterior ao SQL Server 2008 (10.0.x).

ICommandWithParameters::GetParameterInfo

A estrutura DBPARAMINFO retorna as seguintes informações através do parâmetro prgParamInfo :

Tipo de parâmetro wTipo ulParamSize bPrecisão bEscala
data DBTYPE_WSTR 10 ~0 ~0
Hora DBTYPE_WSTR 8, 10..16 ~0 ~0
PequenoDateTime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Observe que alguns desses intervalos de valores não são contínuos; por exemplo, 9 está faltando em 8,10.16. Isto deve-se à adição de um ponto decimal quando a precisão fracionada é superior a zero.

IColumnsRowset::GetColumnsRowset

As seguintes colunas são retornadas:

Tipo de coluna DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION
data DBTYPE_WSTR 10 NULO NULO
Hora DBTYPE_WSTR 8, 10..16 NULO NULO
PequenoDateTime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 NULO NULO
datetimeoffset DBTYPE_WSTR 26,28..34 NULO NULO

ColumnsInfo::GetColumnInfo

A estrutura DBCOLUMNINFO retorna as seguintes informações:

Tipo de parâmetro wTipo ulColumnSize bPrecisão bEscala
data DBTYPE_WSTR 10 ~0 ~0
tempo(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
PequenoDateTime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Conjuntos de linhas de esquema

Esta seção discute metadados para parâmetros, colunas de resultados e conjuntos de linhas de esquema para novos tipos de dados. Essas informações são úteis se você tiver um provedor de cliente desenvolvido usando ferramentas anteriores ao SQL Server 2008 (10.0.x) SQL Server Native Client.

Conjunto de linhas COLUMNS

Os seguintes valores de coluna são retornados para tipos de data/hora:

Tipo de coluna DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
data DBTYPE_WSTR 10 20 NULO
Hora DBTYPE_WSTR 8, 10..16 16,20..32 NULO
PequenoDateTime DBTYPE_DBTIMESTAMP NULO NULO 0
datetime DBTYPE_DBTIMESTAMP NULO NULO 3
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 NULO
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 NULO

PROCEDURE_PARAMETERS conjunto de linhas

Os seguintes valores de coluna são retornados para tipos de data/hora:

Tipo de coluna DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
data DBTYPE_WSTR 10 20 data
Hora DBTYPE_WSTR 8, 10..16 16,20..32 Hora
PequenoDateTime DBTYPE_DBTIMESTAMP NULO NULO PequenoDateTime
datetime DBTYPE_DBTIMESTAMP NULO NULO datetime
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 datetime2
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset

PROVIDER_TYPES conjunto de linhas

As seguintes linhas são retornadas para tipos de data/hora:

Tipo ->

Coluna
data Hora PequenoDateTime datetime datetime2 datetimeoffset
TYPE_NAME data Hora PequenoDateTime datetime datetime2 datetimeoffset
DATA_TYPE DBTYPE_WSTR DBTYPE_WSTR DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP DBTYPE_WSTR DBTYPE_WSTR
COLUMN_SIZE 10 16 16 23 27 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS NULO NULO NULO NULO NULO NULO
IS_NULLABLE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE
CASE_SENSITIVE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
PESQUISÁVEL DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE NULO NULO NULO NULO NULO NULO
FIXED_PREC_SCALE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
AUTO_UNIQUE_VALUE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
LOCAL_TYPE_NAME data Hora PequenoDateTime datetime datetime2 datetimeoffset
MINIMUM_SCALE NULO NULO NULO NULO NULO NULO
MAXIMUM_SCALE NULO NULO NULO NULO NULO NULO
GUID NULO NULO NULO NULO NULO NULO
TYPELIB NULO NULO NULO NULO NULO NULO
VERSÃO NULO NULO NULO NULO NULO NULO
IS_LONG VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
BEST_MATCH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_TRUE VARIANT_FALSE VARIANT_FALSE
IS_FIXEDLENGTH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE

Comportamento do servidor Down-Level

Quando conectado a um servidor de uma versão anterior ao SQL Server 2008 (10.0.x), qualquer tentativa de usar os novos nomes de tipo de servidor (por exemplo, com ICommandWithParameters::SetParameterInfo ou ITableDefinition::CreateTable) resultará em DB_E_BADTYPENAME.

Se novos tipos forem vinculados a parâmetros ou resultados sem o uso de um nome de tipo, e o novo tipo for usado para especificar o tipo de servidor implicitamente ou não houver nenhuma conversão válida do tipo de servidor para o tipo de cliente, DB_E_ERRORSOCCURRED será retornado e DBBINDSTATUS_UNSUPPORTED_CONVERSION será definido como o status de vinculação para o acessador usado em Executar.

Se houver uma conversão de cliente suportada do tipo de buffer para o tipo de servidor para a versão do servidor na conexão, todos os tipos de buffer de cliente podem ser usados. Nesse contexto, tipo de servidor significa o tipo especificado por ICommandWithParameters::SetParameterInfo, ou implícito pelo tipo de buffer se ICommandWithParameters::SetParameterInfo não tiver sido chamado. Isso significa que DBTYPE_DBTIME2 e DBTYPE_DBTIMESTAMPOFFSET podem ser usados com servidores de nível inferior ou quando DataTypeCompatibility=80, se a conversão do cliente para um tipo de servidor suportado for bem-sucedida. É claro que, se o tipo de servidor estiver incorreto, um erro ainda poderá ser relatado pelo servidor se ele não puder executar uma conversão implícita para o tipo de servidor real.

Comportamento SSPROP_INIT_DATATYPECOMPATIBILITY

Quando SSPROP_INIT_DATATYPECOMPATIBILITY é definido como SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, os novos tipos de data/hora e metadados associados aparecem para os clientes como aparecem para clientes de nível inferior, conforme descrito em Alterações de cópia em massa para tipos avançados de data e hora (OLE DB e ODBC).

Comparabilidade para IRowsetFind

Todos os operadores de comparação são permitidos para os novos tipos de data/hora, porque eles aparecem como tipos de cadeia de caracteres em vez de tipos de data/hora.

Ver também

melhorias de data e hora (OLE DB)