Nuevas características de fecha y hora con versiones de SQL Server anteriores (OLE DB)
En este tema se describe el comportamiento que se espera cuando una aplicación cliente que usa características mejoradas de fecha y hora se comunica con una versión de SQL Server anterior a SQL Server 2008 y cuando un cliente compilado con una versión de SQL Server Native Client anterior a SQL Server 2008 envía comandos a un servidor que admite características mejoradas de fecha y hora.
Comportamiento de cliente de nivel inferior
Las aplicaciones cliente que usan una versión de SQL Server Native Client anterior a SQL Server 2008 consideran los nuevos tipos de fecha y hora como columnas nvarchar. El contenido de las columnas son representaciones de literales. Para obtener más información, vea la sección "Formatos de datos: Cadenas y literales" de Compatibilidad con tipos de datos para mejoras de fecha y hora de OLE DB. El tamaño de columna es la longitud máxima del literal para la precisión especificada para la columna.
Las API de catálogo devolverán metadatos coherentes con el código del tipo de datos de nivel inferior que se devuelve al cliente (por ejemplo, nvarchar) y la representación asociada de nivel inferior (por ejemplo, el formato de literal adecuado). Sin embargo, el nombre del tipo de datos devuelto será el nombre del tipo real de SQL Server 2008.
Cuando una aplicación cliente de nivel inferior se ejecuta en un servidor SQL Server 2008 o posterior en el que se han realizado cambios de esquema a tipos de fecha y hora, el comportamiento que se espera es el siguiente:
Tipo de cliente OLE DB |
Tipo de SQL Server 2005 |
Tipo de SQL Server 2008 o posterior |
Conversión del resultado (servidor a cliente) |
Conversión de parámetros (cliente a servidor) |
---|---|---|---|---|
DBTYPE_DBDATE |
Datetime |
Date |
OK |
OK |
DBTYPE_DBTIMESTAMP |
Los campos de hora se establecen en cero. |
Se producirá un error en IRowsetChange debido al truncamiento de la cadena si el campo de hora es distinto de cero. |
||
DBTYPE_DBTIME |
Time(0) |
OK |
OK |
|
DBTYPE_DBTIMESTAMP |
Los campos de fecha se establecen en la fecha actual. |
Se producirá un error en IRowsetChange debido al truncamiento de la cadena si las fracciones de segundo son distintas de cero. Se omite la fecha. |
||
DBTYPE_DBTIME |
Time(7) |
Se produce un error: literal de hora no válido. |
Aceptar |
|
DBTYPE_DBTIMESTAMP |
Se produce un error: literal de hora no válido. |
Aceptar |
||
DBTYPE_DBTIMESTAMP |
Datetime2(3) |
OK |
OK |
|
DBTYPE_DBTIMESTAMP |
Datetime2(7) |
OK |
OK |
|
DBTYPE_DBDATE |
Smalldatetime |
Date |
OK |
OK |
DBTYPE_DBTIMESTAMP |
Los campos de hora se establecen en cero. |
Se producirá un error en IRowsetChange debido al truncamiento de la cadena si el campo de hora es distinto de cero. |
||
DBTYPE_DBTIME |
Time(0) |
OK |
OK |
|
DBTYPE_DBTIMESTAMP |
Los campos de fecha se establecen en la fecha actual. |
Se producirá un error en IRowsetChange debido al truncamiento de la cadena si las fracciones de segundo son distintas de cero. Se omite la fecha. |
||
DBTYPE_DBTIMESTAMP |
Datetime2(0) |
OK |
OK |
OK significa que si ha funcionado con SQL Server 2005, también debería funcionar con SQL Server 2008 o posterior.
Sólo se han considerado los siguientes cambios de esquema:
Uso de un tipo nuevo donde, por lógica, una aplicación solo requiere un valor de fecha u hora. Sin embargo, se ha forzado a la aplicación a usar datetime o smalldatetime porque no había disponibles tipos de fecha y hora independientes.
Uso de un tipo nuevo para obtener más precisión o exactitud en las fracciones de segundo.
Cambio a datetime2 porque se trata del tipo de datos preferido para la fecha y hora.
Se producirá un error en las aplicaciones que usan metadatos del servidor obtenidos a través de ICommandWithParameters::GetParameterInfo o conjuntos de filas de esquema para establecer la información de tipos de parámetro a través de ICommandWithParameters::SetParameterInfo durante las conversiones de cliente donde la representación de cadena de un tipo de origen es mayor que la representación de cadena del tipo de destino. Por ejemplo, si un enlace del cliente usa DBTYPE_DBTIMESTAMP y la columna de servidor es la fecha, SQL Server Native Client convertirá el valor en "aaaa-dd-mm hh:mm:ss.fff", pero los metadatos del servidor se devolverán como nvarchar(10). El desbordamiento resultante produce DBSTATUS_E_CATCONVERTVALUE. Surgen problemas similares con las conversiones de datos realizadas por IRowsetChange, debido a que los metadatos del conjunto de filas se establecen a partir de los metadatos del conjunto de resultados.
Metadatos de parámetros y de conjuntos de filas
En esta sección se describen los metadatos para los parámetros, columnas de resultados y conjuntos de filas de esquema de los clientes compilados con una versión de SQL Server Native Client anterior a SQL Server 2008.
ICommandWithParameters::GetParameterInfo
La estructura DBPARAMINFO devuelve la información siguiente a través del 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 |
Observe que algunos de estos intervalos de valores no son continuos; por ejemplo, en el intervalo 8,10..16 falta el 9. Esto se debe a la adición de un separador decimal cuando la precisión fraccionaria es mayor que cero.
IColumnsRowset::GetColumnsRowset
Se devuelven las siguientes columnas:
Tipo de columna |
DBCOLUMN_TYPE |
DBCOLUMN_COLUMNSIZE |
DBCOLUMN_PRECISION |
DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION |
---|---|---|---|---|
date |
DBTYPE_WSTR |
10 |
NULL |
NULL |
time |
DBTYPE_WSTR |
8, 10..16 |
NULL |
NULL |
smalldatetime |
DBTYPE_DBTIMESTAMP |
16 |
16 |
0 |
datetime |
DBTYPE_DBTIMESTAMP |
16 |
23 |
3 |
datetime2 |
DBTYPE_WSTR |
19,21..27 |
NULL |
NULL |
datetimeoffset |
DBTYPE_WSTR |
26,28..34 |
NULL |
NULL |
ColumnsInfo::GetColumnInfo
La estructura DBCOLUMNINFO devuelve la siguiente información:
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 filas de esquema
En esta sección se describen los metadatos para los parámetros, columnas de resultados y conjuntos de filas de esquema de los nuevos tipos de datos. Esta información le resultará de gran utilidad si tiene un proveedor del cliente desarrollado con herramientas anteriores a SQL Server 2008 SQL Server Native Client.
Conjunto de filas COLUMNS
Para los tipos de fecha y hora se devuelven los siguientes valores de columna:
Tipo de columna |
DATA_TYPE |
CHARACTER_MAXIMUM_LENGTH |
CHARACTER_OCTET_LENGTH |
DATETIME_PRECISION |
---|---|---|---|---|
date |
DBTYPE_WSTR |
10 |
20 |
NULL |
time |
DBTYPE_WSTR |
8, 10..16 |
16,20..32 |
NULL |
smalldatetime |
DBTYPE_DBTIMESTAMP |
NULL |
NULL |
0 |
datetime |
DBTYPE_DBTIMESTAMP |
NULL |
NULL |
3 |
datetime2 |
DBTYPE_WSTR |
19,21..27 |
38,42..54 |
NULL |
datetimeoffset |
DBTYPE_WSTR |
26,28..34 |
52, 56..68 |
NULL |
Conjunto de filas PROCEDURE_PARAMETERS
Para los tipos de fecha y hora se devuelven los siguientes valores de columna:
Tipo de columna |
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 |
NULL |
NULL |
smalldatetime |
datetime |
DBTYPE_DBTIMESTAMP |
NULL |
NULL |
datetime |
datetime2 |
DBTYPE_WSTR |
19,21..27 |
38,42..54 |
datetime2 |
datetimeoffset |
DBTYPE_WSTR |
26,28..34 |
52, 56..68 |
datetimeoffset |
Conjunto de filas PROVIDER_TYPES
Para los tipos de fecha y hora se devuelven las siguientes filas:
Tipo -> Columna |
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 |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
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 |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
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 |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
MAXIMUM_SCALE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
GUID |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
TYPELIB |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
VERSION |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
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 |
Comportamiento de servidor de nivel inferior
Si está conectado a un servidor de una versión anterior a SQL Server 2008, cualquier intento por usar los nuevos nombres de tipo de servidor (por ejemplo, con ICommandWithParameters::SetParameterInfo o ITableDefinition::CreateTable) dará lugar a DB_E_BADTYPENAME.
Si los nuevos tipos se enlazan en parámetros o resultados sin usar un nombre de tipo y el nuevo tipo se usa para especificar implícitamente el tipo de servidor, o no hay ninguna conversión válida del tipo de servidor al tipo de cliente, se devuelve DB_E_ERRORSOCCURRED, y DBBINDSTATUS_UNSUPPORTED_CONVERSION se establece como estado de enlace para el descriptor de acceso que se usó en Execute.
Si hay una conversión de cliente compatible del tipo de búfer al tipo de servidor para la versión del servidor en la conexión, pueden usarse todos los tipos de búfer del cliente. En este contexto, tipo de servidor significa el tipo especificado por ICommandWithParameters::SetParameterInfo o establecido implícitamente por el tipo de búfer si no se ha llamado a ICommandWithParameters::SetParameterInfo. Esto significa que DBTYPE_DBTIME2 y DBTYPE_DBTIMESTAMPOFFSET pueden usarse con servidores de nivel inferior, o cuando DataTypeCompatibility=80, si la conversión del cliente a un tipo de servidor compatible se realiza correctamente. Es evidente que si el tipo de servidor es incorrecto, el servidor todavía podría notificar un error si no puede realizar una conversión implícita al tipo de servidor real.
Comportamiento de SSPROP_INIT_DATATYPECOMPATIBILITY
Cuando SSPROP_INIT_DATATYPECOMPATIBILITY se establece en SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, los nuevos tipos de fecha y hora, así como los metadatos asociados, se muestran a los clientes del mismo modo que se muestran a los clientes de nivel inferior, tal y como se describe en Cambios de copia masiva para tipos de fecha y hora mejorados (OLE DB y ODBC).
Comparaciones en IRowsetFind
Se permiten todos los operadores de comparación para los nuevos tipos de fecha y hora, debido a que aparecen como tipos de cadena en lugar de tipos de fecha y hora.