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

Aplica-se a: simSQL Server (todas as versões compatíveis) SimBanco de Dados SQL do Azure SimInstância Gerenciada do Azure SQL simAzure Synapse Analytics simParallel Data Warehouse

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 oferece suporte a 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. O conteúdo da coluna são as representações literais, conforme descrito na seção "formatos de dados: cadeias de caracteres e literais" do suporte de tipo de dados para melhorias de data e hora 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 nível inferior em todos os aspectos, incluindo o nome do tipo. Um exemplo desse tipo de nível inferior é nvarchar.

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

Tipo SQL Server 2005 SQL Server 2008Tipo (ou posterior) Tipo de cliente ODBC Conversão do resultado (de SQL para C) Conversão do parâmetro (de C para SQL)
Datetime Data 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 (9.x).
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. Falhará se os segundos fracionários forem diferentes de zero. Funciona com o SQL Server 2005 (9.x).
Time(7) SQL_C_TIME Falha-literal de tempo inválido. OK (1)
SQL_C_TYPE_TIMESTAMP Falha-literal de tempo 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 Data 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 (9.x).
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 (9.x).
Datetime2(0) SQL_C_TYPE_TIMESTAMP OK OK

Legenda dos símbolos

Símbolo Significado
1 Se funcionar com o SQL Server 2005 (9.x), deverá continuar a funcionar com uma versão mais recente do SQL Server.
2 Um aplicativo que funcionava com o SQL Server 2005 (9.x) 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 NULO NULO 0 3 NULO NULO
SQL_DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_DATETIME SQL_DATETIME SQL_WVARCHAR SQL_WVARCHAR
SQL_DATETIME_SUB NULO NULO SQL_CODE_TIMESTAMP SQL_CODE_TIMESTAMP NULO NULO
CHAR_OCTET_LENGTH NULO NULO NULO NULO NULO NULO
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 NULO NULO NULO NULO NULO NULO
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
PESQUISÁVEL SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE
UNSIGNED_ATTRIBUTE NULO NULO NULO NULO NULO NULO
FXED_PREC_SCALE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE
AUTO_UNIQUE_VALUE NULO NULO NULO NULO NULO NULO
LOCAL_TYPE_NAME date time smalldatetime DATETIME datetime2 datetimeoffset
MINIMUM_SCALE NULO NULO 0 3 NULO NULO
MAXIMUM_SCALE NULO NULO 0 3 NULO NULO
SQL_DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_DATETIME SQL_DATETIME SQL_WVARCHAR SQL_WVARCHAR
SQL_DATETIME_SUB NULO NULO SQL_CODE_TIMESTAMP SQL_CODE_TIMESTAMP NULO NULO
NUM_PREC_RADIX NULO NULO NULO NULO NULO NULO
INTERVAL_PRECISION NULO NULO NULO NULO NULO NULO
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

Melhorias de data e hora ()ODBC