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

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure PDW (Sistema de Plataforma de Análise) do Azure Synapse Analytics

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.

Comportamento do cliente de versão anterior

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 de 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 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 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 real do tipo 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 nos tipos de data/hora, o comportamento esperado é o seguinte:

Tipo de cliente OLE DB Tipo SQL Server 2005 Tipo do SQL Server 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 forem diferentes de 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 Data/hora2(3) OK OK
DBTYPE_DBTIMESTAMP Data/hora2(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 forem diferentes de zero.

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

OK significa que, se funcionou com o SQL Server 2005 (9.x), ele deve continuar a funcionar com o SQL Server 2008 (10.0.x) (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. No entanto, o aplicativo foi forçado a usar datetime ou smalldatetime porque os tipos de data e hora separados 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 esse é o tipo de dados preferencial 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 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 date, 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 estouro resultante causa DBSTATUS_E_CATCONVERTVALUE. Problemas semelhantes surgem com conversões de dados por IRowsetChange, pois 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 ao SQL Server 2008 (10.0.x).

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 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 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 (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 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 os metadados associados aparecem para os clientes da mesma forma que 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.

Confira também

Melhorias de data e hora (OLE DB)