Compartir a través de


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 tipo de nivel inferior es nvarchar.

Cuando una aplicación de cliente de nivel inferior se ejecuta en un servidor SQL Server 2008 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

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

OK

OK (1)

Datetime2(7)

SQL_C_TYPE_TIMESTAMP

OK

El valor se redondeará a la fracción 1/300 de segundo por conversión del cliente.

Smalldatetime

Date

SQL_C_TYPE_DATE

OK

OK

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

OK

OK

Clave de los símbolos

Símbolo

Significado

1

Si funcionara con SQL Server 2005, debería continuar funcionando con SQL Server 2008.

2

Se podría producir un error con SQL Server 2008 en una aplicación que funcionara con SQL Server 2005.

Observe que sólo 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

hora

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".