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