Compartir a través de


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.

Vea también

Conceptos