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".