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.