Compartilhar via


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

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 a SQL Server 2008 e quando um cliente compilado com uma versão do SQL Server Native Client anterior a SQL Server O 2008 envia comandos para um servidor que dá suporte a recursos avançados de data e hora.

Comportamento do cliente de versão anterior

Os aplicativos cliente que usam uma versão do SQL Server Native Client anteriores ao SQL Server 2008 veem os novos tipos de data/hora como nvarchar colunas. O conteúdo de coluna são representações literais. Para obter mais informações, consulte a seção "Formatos de dados: cadeias de caracteres e literais" do Suporte a tipos de dados para melhorias de data e hora do OLE DB. O tamanho da coluna é o comprimento de 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 versão anterior retornado ao cliente (por exemplo, nvarchar) e a representação de versão anterior associada (por exemplo, o formato de literal apropriado). No entanto, o nome do tipo de dados retornado será o nome real do tipo SQL Server 2008.

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

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

A data é ignorada.
DBTYPE_DBTIME Time(7) Falha – literal de tempo inválido. OK
DBTYPE_DBTIMESTAMP Falha – literal de tempo inválido. OK
DBTYPE_DBTIMESTAMP Datetime2(3) OK OK
DBTYPE_DBTIMESTAMP Datetime2(7) OK OK
DBTYPE_DBDATE Smalldatetime Data OK OK
DBTYPE_DBTIMESTAMP Campos de hora definidos como zero. IRowsetChange falhará devido ao truncamento de cadeia de caracteres se o campo de tempo for diferente de zero.
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP Campos de data definidos como a data atual. IRowsetChange falhará devido ao truncamento de cadeia de caracteres se os segundos fracionários não forem zero.

A data é ignorada.
DBTYPE_DBTIMESTAMP Datetime2(0) OK OK

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

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

  • Usar um novo tipo em que logicamente um aplicativo exige somente um valor de data ou hora. Porém, o aplicativo foi forçado a usar datetime ou smalldatetime porque tipos distintos de data e hora não estavam disponíveis.

  • Usar um novo tipo para obter precisão ou exatidão adicional de frações de segundos.

  • Alternar 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, 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 estouro resultante causa DBSTATUS_E_CATCONVERTVALUE. 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.

Parâmetro e metadados de conjunto de linhas

Esta seção descreve metadados para parâmetros, colunas de resultado e conjuntos de linhas de esquema para clientes compilados com uma versão do SQL Server Native Client anterior a SQL Server 2008.

ICommandWithParameters::GetParameterInfo

A estrutura DBPARAMINFO retorna as seguintes informações por meio do parâmetro prgParamInfo :

Tipo de parâmetro wType ulParamSize bPrecision bScale
date DBTYPE_WSTR 10 ~0 ~0
time DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime 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

Note que alguns destes intervalos de valor não são contínuos; por exemplo, 9 está faltando em 8,10..16. Isso se deve à adição de um ponto decimal quando a precisão fracionária é maior que zero.

IColumnsRowset::GetColumnsRowset

As seguintes colunas são retornadas:

Tipo de coluna DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION
date DBTYPE_WSTR 10 NULO NULO
time DBTYPE_WSTR 8, 10..16 NULO NULO
smalldatetime 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 de DBCOLUMNINFO retorna as seguintes informações:

Tipo de parâmetro wType ulColumnSize bPrecision bScale
date DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime 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 aborda metadados para parâmetros, colunas de resultados e conjuntos de linhas de esquema para novos tipos de dados. Essas informações são úteis porque você tem um provedor cliente desenvolvido usando ferramentas anteriores a SQL Server 2008 SQL Server Native Client.

Conjunto de linhas de COLUMNS

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

Tipo de coluna DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
date DBTYPE_WSTR 10 20 NULO
time DBTYPE_WSTR 8, 10..16 16,20..32 NULO
smalldatetime 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

Conjunto de linhas de PROCEDURE_PARAMETERS

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

Tipo de coluna DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
date DBTYPE_WSTR 10 20 date
time DBTYPE_WSTR 8, 10..16 16,20..32 time
smalldatetime DBTYPE_DBTIMESTAMP NULO NULO smalldatetime
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

Conjunto de linhas de PROVIDER_TYPES

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

Tipo ->

Coluna
date time smalldatetime DATETIME datetime2 datetimeoffset
TYPE_NAME date time smalldatetime 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
SEARCHABLE 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 date time smalldatetime 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
VERSION 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 de servidor de versão anterior

Quando conectado a um servidor de uma versão anterior ao SQL Server 2008, 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 associados para 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 se não houver nenhuma conversão válida do tipo de servidor no tipo de cliente, DB_E_ERRORSOCCURRED será retornado e DBBINDSTATUS_UNSUPPORTED_CONVERSION será definido como o status de associação para o acessador usado em Execute.

Se houver uma conversão de cliente aceita do tipo de buffer no tipo de servidor para a versão do servidor na conexão, todos os tipos de buffer do cliente poderão ser usados. Nesse contexto, o 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. Isto significa que DBTYPE_DBTIME2 e DBTYPE_DBTIMESTAMPOFFSET poderão ser usados com servidores de versões anteriores ou quando DataTypeCompatibility=80, se a conversão de cliente em um tipo de servidor aceito for bem-sucedida. Obviamente, se o tipo de servidor estiver correto, um erro ainda poderá ser relatado pelo servidor se ele não puder executar uma conversão implícita no tipo de servidor real.

Comportamento de 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 conforme 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).

Comparações de 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.

Consulte Também

Melhorias de data e hora (OLE DB)