Comportamiento mejorado de tipos de fecha y hora con versiones anteriores de SQL Server (ODBC)
En este tema se describe el comportamiento esperado cuando una aplicación cliente que usa las características de fecha y hora mejoradas se comunica con una versión de SQL Server anterior a SQL Server 2008, y cuando una aplicación cliente que usa Microsoft Data Access Components, Windows Data Access Components o una versión de SQL Server Native Client anterior a SQL Server 2008 envía los comandos a un servidor que admite las características de fecha y hora mejoradas.
Comportamiento del cliente de nivel inferior
Las aplicaciones cliente que se compilaron mediante una versión de SQL Server antes de SQL Server 2008 Native Client ven los nuevos tipos de fecha y hora como columnas nvarchar. El contenido de la columna son las representaciones literales, tal y como se describe en la sección "Formatos de datos: Cadenas y literales" de Compatibilidad con tipos de datos para mejoras de fecha y hora de ODBC. El tamaño de columna es la longitud máxima literal de la precisión de fracciones de segundos 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.
Los metadatos de instrucción devueltos por SQLDescribeCol, SQLDescribeParam, SQGetDescField y SQLColAttribute devolverán metadatos coherentes con el tipo del nivel inferior en todos los respectos, incluyendo el nombre del tipo. Un ejemplo de este tipo de nivel inferior es nvarchar.
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 SQL Server 2005 |
Tipo de SQL Server 2008 (o posterior) |
Tipo de cliente ODBC |
Conversión del resultado (SQL a C) |
Conversión de parámetros (C a SQL) |
---|---|---|---|---|
Datetime |
Date |
SQL_C_TYPE_DATE |
OK |
OK (1) |
SQL_C_TYPE_TIMESTAMP |
Los campos de hora se establecen en cero. |
OK (2) Se produce un error si el campo de hora es distinto de cero. Funciona con SQL Server 2005. |
||
Time(0) |
SQL_C_TYPE_TIME |
OK |
OK (1) |
|
SQL_C_TYPE_TIMESTAMP |
Los campos de fecha se establecen en la fecha actual. |
OK (2) Fecha omitida. Se produce un error si las fracciones de segundo son distintas de cero. Funciona con SQL Server 2005. |
||
Time(7) |
SQL_C_TIME |
Se produce un error: literal de hora no válido. |
OK (1) |
|
SQL_C_TYPE_TIMESTAMP |
Se produce un error: literal de hora no válido. |
OK (1) |
||
Datetime2(3) |
SQL_C_TYPE_TIMESTAMP |
Aceptar |
OK (1) |
|
Datetime2(7) |
SQL_C_TYPE_TIMESTAMP |
Aceptar |
El valor se redondeará a la fracción 1/300 de segundo por conversión del cliente. |
|
Smalldatetime |
Date |
SQL_C_TYPE_DATE |
Aceptar |
Aceptar |
SQL_C_TYPE_TIMESTAMP |
Los campos de hora se establecen en cero. |
OK (2) Se produce un error si el campo de hora es distinto de cero. Funciona con SQL Server 2005. |
||
Time(0) |
SQL_C_TYPE_TIME |
OK |
OK |
|
SQL_C_TYPE_TIMESTAMP |
Los campos de fecha se establecen en la fecha actual. |
OK (2) Fecha omitida. Se produce un error si las fracciones de segundo son distintas de cero. Funciona con SQL Server 2005. |
||
Datetime2(0) |
SQL_C_TYPE_TIMESTAMP |
Aceptar |
Aceptar |
Clave de los símbolos
Símbolo |
Significado |
---|---|
1 |
Si funcionaba con SQL Server 2005, debe continuar funcionando con una versión más reciente de SQL Server. |
2 |
Una aplicación que funcionaba con SQL Server 2005 podría producir un error con una versión más reciente de SQL Server. |
Observe que solo se han considerado los cambios de esquema comunes. A continuación, se indican las cambios comunes:
Usar un nuevo tipo donde de forma lógica una aplicación requiere un único valor de fecha u hora. Sin embargo, se forzó a la aplicación a que usara datetime o smalldatetime debido a la falta de tipos de fecha y hora independientes.
Usar un nuevo tipo para obtener más precisión o exactitud en fracciones de segundo.
Cambiar a datetime2 porque éste es el datatype de fecha y hora preferido.
Metadatos de columna devueltos por SQLColumns, SQLProcedureColumns y SQLSpecialColumns
Para los tipos de fecha y hora se devuelven los siguientes valores de columna:
Tipo de columna |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
---|---|---|---|---|---|---|
DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_TYPE_TIMESTAMP |
SQL_TYPE_TIMESTAMP |
SQL_WVARCHAR |
SQL_WVARCHAR |
TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
COLUMN_SIZE |
10 |
8,10..16 |
16 |
23 |
19, 21..27 |
26, 28..34 |
BUFFER_LENGTH |
20 |
16, 20..32 |
16 |
16 |
38, 42..54 |
52, 56..68 |
DECIMAL_DIGITS |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
SQL_DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME |
SQL_DATETIME |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME_SUB |
NULL |
NULL |
SQL_CODE_TIMESTAMP |
SQL_CODE_TIMESTAMP |
NULL |
NULL |
CHAR_OCTET_LENGTH |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
SS_DATA_TYPE |
0 |
0 |
111 |
111 |
0 |
0 |
SQLSpecialColumns no devuelve SQL_DATA_TYPE, SQL_DATETIME_SUB, CHAR_OCTET_LENGTH o SS_DATA_TYPE.
Metadatos de tipo de dato devueltos por SQLGetTypeInfo
Para los tipos de fecha y hora se devuelven los siguientes valores de columna:
Tipo de columna |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_TYPE_TIMESTAMP |
SQL_TYPE_TIMESTAMP |
SQL_WVARCHAR |
SQL_WVARCHAR |
COLUMN_SIZE |
10 |
16 |
16 |
23 |
27 |
34 |
LITERAL_PREFIX |
‘ |
‘ |
‘ |
‘ |
‘ |
‘ |
LITERAL_SUFFIX |
‘ |
‘ |
‘ |
‘ |
‘ |
‘ |
CREATE_PARAMS |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
CASE_SENSITIVE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
UNSIGNED_ATTRIBUTE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
FXED_PREC_SCALE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
AUTO_UNIQUE_VALUE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
LOCAL_TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
MINIMUM_SCALE |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
MAXIMUM_SCALE |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
SQL_DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME |
SQL_DATETIME |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME_SUB |
NULL |
NULL |
SQL_CODE_TIMESTAMP |
SQL_CODE_TIMESTAMP |
NULL |
NULL |
NUM_PREC_RADIX |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
INTERVAL_PRECISION |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
USERTYPE |
0 |
0 |
12 |
22 |
0 |
0 |
Comportamiento de un servidor de nivel inferior
Cuando se conecta a una instancia de servidor de una versión anterior a SQL Server 2008, cualquier intento de usar los nuevos tipos de servidor o códigos de metadatos asociados y campos de descriptor hará que se devuelva un SQL_ERROR. Se generará un registro de diagnóstico con SQLSTATE HY004 y un mensaje que indica que el tipo de datos SQL para la versión del servidor en la conexión no es válido o con 07006 y "Infracción del atributo de tipo de datos restringido".