Compartir a través de


Nuevas características de fecha y hora con versiones de SQL Server anteriores (OLE DB)

Se aplica a: SQL Server Azure SQL Database Azure SQL Instancia administrada Azure Synapse Analytics Analytics Platform System (PDW)

En este tema se describe el comportamiento esperado 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 (10.0.x) y cuando un cliente compilado con una versión de SQL Server Native Client anterior a SQL Server 2008 (10.0.x) envía comandos a un servidor que admite características mejoradas de fecha y hora.

Comportamiento del cliente de nivel inferior

Las aplicaciones cliente que usan una versión de SQL Server Native Client anterior a SQL Server 2008 (10.0.x) ven 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 de tipos de datos para las 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 de tipo de datos de nivel descendente devuelto al cliente (por ejemplo, nvarchar) y la representación de nivel descendente asociada (por ejemplo, el formato literal adecuado). Sin embargo, el nombre del tipo de datos devuelto será el nombre de tipo real de SQL Server 2008 (10.0.x).

Cuando una aplicación cliente de nivel anterior se ejecuta en un servidor de SQL Server 2008 (10.0.x) (o posterior) en el que se han realizado cambios de esquema en los tipos de fecha y hora, el comportamiento esperado 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 Aceptar Aceptar
DBTYPE_DBTIMESTAMP Los campos de hora se establecen en cero. IRowsetChange producirá un error debido al truncamiento de cadenas si el campo de hora es distinto de cero.
DBTYPE_DBTIME Time(0) Aceptar Aceptar
DBTYPE_DBTIMESTAMP Los campos de fecha se establecen en la fecha actual. IRowsetChange producirá un error debido al truncamiento de cadenas si las fracciones de segundos no son cero.

Se omite la fecha.
DBTYPE_DBTIME Time(7) Error: literal de hora no válido. OK (CORRECTO)
DBTYPE_DBTIMESTAMP Error: literal de hora no válido. OK (CORRECTO)
DBTYPE_DBTIMESTAMP Datetime2(3) Aceptar Aceptar
DBTYPE_DBTIMESTAMP Datetime2(7) Aceptar Aceptar
DBTYPE_DBDATE Smalldatetime Date Aceptar Aceptar
DBTYPE_DBTIMESTAMP Los campos de hora se establecen en cero. IRowsetChange producirá un error debido al truncamiento de cadenas si el campo de tiempo no es cero.
DBTYPE_DBTIME Time(0) Aceptar Aceptar
DBTYPE_DBTIMESTAMP Los campos de fecha se establecen en la fecha actual. IRowsetChange producirá un error debido al truncamiento de cadenas si las fracciones de segundos no son cero.

Se omite la fecha.
DBTYPE_DBTIMESTAMP Datetime2(0) Aceptar Aceptar

Ok significa que si funcionaba con SQL Server 2005 (9.x), debería seguir trabajando con SQL Server 2008 (10.0.x) (o posterior).

Solo se han considerado los siguientes cambios de esquema:

  • Usar un nuevo tipo donde de forma lógica una aplicación requiere un único valor de fecha u hora. Sin embargo, la aplicación se vio obligada a usar datetime o smalldatetime porque los tipos de fecha y hora independientes no estaban disponibles.

  • Usar un nuevo tipo para obtener más precisión o exactitud en fracciones de segundo.

  • Cambiar a datetime2 porque es el tipo de datos preferido para la fecha y hora.

Las aplicaciones que usan metadatos de servidor obtenidos a través de ICommandWithParameters::GetParameterInfo o conjuntos de filas de esquema para establecer información de tipo de parámetro a través de ICommandWithParameters::SetParameterInfo producirán un error 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 de cliente usa DBTYPE_DBTIMESTAMP y la columna del servidor es 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 por IRowsetChange, ya que los metadatos del conjunto de filas se establecen a partir de los metadatos del conjunto de resultados.

Parámetros y metadatos de conjuntos de filas

En esta sección se describen los metadatos de parámetros, columnas de resultados y conjuntos de filas de esquema para los clientes que se compilan con una versión de SQL Server Native Client anterior a SQL Server 2008 (10.0.x).

ICommandWithParameters::GetParameterInfo

La estructura DBPARAMINFO devuelve la siguiente información 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 es útil es que tiene un proveedor de clientes desarrollado con herramientas anteriores a SQL Server 2008 (10.0.x) 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 un servidor de nivel inferior

Cuando se conecta a un servidor de una versión anterior a SQL Server 2008 (10.0.x), cualquier intento de usar los nuevos nombres de tipo de servidor (por ejemplo, con ICommandWithParameters::SetParameterInfo o ITableDefinition::CreateTable) dará como resultado 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, el tipo de servidor significa el tipo especificado por ICommandWithParameters::SetParameterInfo o implícito en 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 y los metadatos asociados aparecen a los clientes a medida que aparecen para los clientes de nivel inferior, como se describe en Cambios de copia masiva para tipos mejorados de fecha y hora (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.

Consulte también

Mejoras en la fecha y la hora (OLE DB)