Partilhar via


Comportamento de tipos de data/hora aprimorados com versões anteriores do SQL Server (ODBC)

Este tópico descreve o comportamento esperado quando um aplicativo cliente que usa recursos aprimorados de data e hora se comunica com uma versão do SQL Server anterior ao SQL Server 2008 e quando um aplicativo cliente que usa o Microsoft Data Access Components, o Windows Data Access Components ou uma versão do SQL Server Native Client anterior ao SQL Server 2008 envia comandos para um servidor que suporta recursos aprimorados de data e hora.

Comportamento do cliente de versão anterior

Os aplicativos cliente que foram compilados usando uma versão do SQL Server Native Client anterior ao SQL Server 2008 vêm os novos tipos de data/hora como colunas nvarchar. Os conteúdos de coluna são as representações literais, conforme descrito na seção sobre cadeias de caracteres e literais dos formatos de dados de Suporte a tipos de dados para aprimoramentos de data/hora do ODBC. O tamanho da coluna é o comprimento de literal máximo para a precisão de segundos fracionários especificada da 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). Entretanto, o nome do tipo de dados retornado será o nome de tipo SQL Server 2008 real.

Os metadados de instrução retornados por SQLDescribeCol, SQLDescribeParam, SQGetDescField e SQLColAttribute retornarão metadados que são consistentes com o tipo de versão anterior em todos os aspectos, incluindo o nome do tipo. Um exemplo desse tipo de versão anterior é nvarchar.

Quando um aplicativo cliente de versão anterior é executado com base em um servidor SQL Server 2008 (ou posterior) em que foram feitas alterações de esquema nos tipos de data/hora, o comportamento esperado é este:

Tipo SQL Server 2005

Tipo SQL Server 2008 (ou posterior)

Tipo de cliente ODBC

Conversão do resultado (de SQL para C)

Conversão do parâmetro (de C para SQL)

Datetime

Date

SQL_C_TYPE_DATE

OK

OK (1)

SQL_C_TYPE_TIMESTAMP

Campos de hora definidos como zero.

OK (2)

Falha se o campo de hora for diferente de zero. Funciona com o SQL Server 2005.

Time(0)

SQL_C_TYPE_TIME

OK

OK (1)

SQL_C_TYPE_TIMESTAMP

Campos de data definidos como a data atual.

OK (2)

Data ignorada. Falha se os segundos fracionários forem diferentes de zero. Funciona com o SQL Server 2005.

Time(7)

SQL_C_TIME

Falha – literal de hora inválido.

OK (1)

SQL_C_TYPE_TIMESTAMP

Falha – literal de hora inválido.

OK (1)

Datetime2(3)

SQL_C_TYPE_TIMESTAMP

OK

OK (1)

Datetime2(7)

SQL_C_TYPE_TIMESTAMP

OK

Valor será arredondado para 1/300º segundo por conversão de cliente.

Smalldatetime

Date

SQL_C_TYPE_DATE

OK

OK

SQL_C_TYPE_TIMESTAMP

Campos de hora definidos como zero.

OK (2)

Falha se o campo de hora for diferente de zero. Funciona com o SQL Server 2005.

Time(0)

SQL_C_TYPE_TIME

OK

OK

SQL_C_TYPE_TIMESTAMP

Campos de data definidos como a data atual.

OK (2)

Data ignorada. Falha se os segundos fracionários forem diferentes de zero.

Funciona com o SQL Server 2005.

Datetime2(0)

SQL_C_TYPE_TIMESTAMP

OK

OK

Legenda dos símbolos

Símbolo

Significado

1

Se funcionar com o SQL Server 2005, deverá continuar a funcionar com uma versão mais recente do SQL Server.

2

Um aplicativo que funcionava com o SQL Server 2005 poderia falhar com uma versão mais recente do SQL Server.

Observe que só foram consideradas alterações de esquema comuns. A seguir estão as alterações comuns:

  • Usar um novo tipo em que logicamente um aplicativo exige somente um valor de data ou hora. Entretanto, o aplicativo foi obrigado a usar datetime ou smalldatetime devido à falta de tipos de data e hora separados.

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

  • Trocar para datetime2 porque esse é o tipo de dados de data e hora preferido.

Metadados de coluna retornados por SQLColumns, SQLProcedureColumns e SQLSpecialColumns

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

Tipo de coluna

date

time

smalldatetime

datetime

datetime2

datetimeoffset

DATA_TYPE

SQL_WVARCHAR

SQL_WVARCHAR

SQL_TYPE_TIMESTAMP

SQL_TYPE_TIMESTAMP

SQL_WVARCHAR

SQL_WVARCHAR

TYPE_NAME

date

time

smalldatetime

datetime

datetime2

datetimeoffset

COLUMN_SIZE

10

8,10..16

16

23

19, 21..27

26, 28..34

BUFFER_LENGTH

20

16, 20..32

16

16

38, 42..54

52, 56..68

DECIMAL_DIGITS

NULL

NULL

0

3

NULL

NULL

SQL_DATA_TYPE

SQL_WVARCHAR

SQL_WVARCHAR

SQL_DATETIME

SQL_DATETIME

SQL_WVARCHAR

SQL_WVARCHAR

SQL_DATETIME_SUB

NULL

NULL

SQL_CODE_TIMESTAMP

SQL_CODE_TIMESTAMP

NULL

NULL

CHAR_OCTET_LENGTH

NULL

NULL

NULL

NULL

NULL

NULL

SS_DATA_TYPE

0

0

111

111

0

0

SQLSpecialColumns não retorna SQL_DATA_TYPE, SQL_DATETIME_SUB, CHAR_OCTET_LENGTH ou SS_DATA_TYPE.

Metadados de tipo de dados retornados por SQLGetTypeInfo

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

Tipo de coluna

date

time

smalldatetime

datetime

datetime2

datetimeoffset

TYPE_NAME

date

time

smalldatetime

datetime

datetime2

datetimeoffset

DATA_TYPE

SQL_WVARCHAR

SQL_WVARCHAR

SQL_TYPE_TIMESTAMP

SQL_TYPE_TIMESTAMP

SQL_WVARCHAR

SQL_WVARCHAR

COLUMN_SIZE

10

16

16

23

27

34

LITERAL_PREFIX

LITERAL_SUFFIX

CREATE_PARAMS

NULL

NULL

NULL

NULL

NULL

NULL

NULLABLE

SQL_NULLABLE

SQL_NULLABLE

SQL_NULLABLE

SQL_NULLABLE

SQL_NULLABLE

SQL_NULLABLE

CASE_SENSITIVE

SQL_FALSE

SQL_FALSE

SQL_FALSE

SQL_FALSE

SQL_FALSE

SQL_FALSE

SEARCHABLE

SQL_PRED_SEARCHABLE

SQL_PRED_SEARCHABLE

SQL_PRED_SEARCHABLE

SQL_PRED_SEARCHABLE

SQL_PRED_SEARCHABLE

SQL_PRED_SEARCHABLE

UNSIGNED_ATTRIBUTE

NULL

NULL

NULL

NULL

NULL

NULL

FXED_PREC_SCALE

SQL_FALSE

SQL_FALSE

SQL_FALSE

SQL_FALSE

SQL_FALSE

SQL_FALSE

AUTO_UNIQUE_VALUE

NULL

NULL

NULL

NULL

NULL

NULL

LOCAL_TYPE_NAME

date

hora

smalldatetime

datetime

datetime2

datetimeoffset

MINIMUM_SCALE

NULL

NULL

0

3

NULL

NULL

MAXIMUM_SCALE

NULL

NULL

0

3

NULL

NULL

SQL_DATA_TYPE

SQL_WVARCHAR

SQL_WVARCHAR

SQL_DATETIME

SQL_DATETIME

SQL_WVARCHAR

SQL_WVARCHAR

SQL_DATETIME_SUB

NULL

NULL

SQL_CODE_TIMESTAMP

SQL_CODE_TIMESTAMP

NULL

NULL

NUM_PREC_RADIX

NULL

NULL

NULL

NULL

NULL

NULL

INTERVAL_PRECISION

NULL

NULL

NULL

NULL

NULL

NULL

USERTYPE

0

0

12

22

0

0

Comportamento de servidor de versão anterior

Quando você está conectado a uma instância de servidor de uma versão anterior do SQL Server 2008, qualquer tentativa de usar os novos tipos de servidor ou os códigos de metadados e campos de descritor associados resultará no retorno de SQL_ERROR. Um registro de diagnóstico será gerado com SQLSTATE HY004 e a mensagem "Tipo de dados SQL inválido para a versão do servidor na conexão" ou com 07006 e "Violação do atributo de tipo de dados restrito".

Consulte também

Conceitos