Comportamiento mejorado de tipos de fecha y hora con versiones anteriores de SQL Server (ODBC)

Se aplica a: síSQL Server (todas las versiones admitidas) SíAzure SQL Database SíInstancia administrada de Azure SQL síAzure Synapse Analytics síAlmacenamiento de datos paralelos

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, como se describe en la sección "formatos de datos: cadenas y literales" de compatibilidad de tipos de datos con las 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 la instrucción devueltos por SQLDescribeCol, SQLDescribeParam, SQGetDescField y SQLColAttribute devolverán metadatos coherentes con el tipo de nivel inferior en todos los aspectos, incluido 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 SQL Server 2008 servidor (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 SQL Server 2005 SQL Server 2008Tipo de  (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 Aceptar ACEPTAR (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 (9.x).
Time(0) SQL_C_TYPE_TIME Aceptar ACEPTAR (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 (9.x).
Time(7) SQL_C_TIME Error: literal de hora no válido. ACEPTAR (1)
SQL_C_TYPE_TIMESTAMP Error: literal de hora no válido. ACEPTAR (1)
Datetime2 (3) SQL_C_TYPE_TIMESTAMP Aceptar ACEPTAR (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 (9.x).
Time(0) SQL_C_TYPE_TIME Aceptar Aceptar
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 (9.x).
Datetime2(0) SQL_C_TYPE_TIMESTAMP Aceptar Aceptar

Clave de los símbolos

Símbolo Significado
1 Si funcionaba con SQL Server 2005 (9.x), debe continuar funcionando con una versión más reciente de SQL Server.
2 Una aplicación que funcionaba con SQL Server 2005 (9.x) 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
BUSCABLE 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".

Consulte también

Mejoras de fecha y hora (ODBC)