Actualizar una aplicación de SQL Server 2005 Native Client a SQL Server 2008 Native Client

SQL Server 2008 incluye SQL Server Native Client 10.0. En este tema se describen las diferencias de comportamiento entre esta versión y las versiones anteriores de SQL Server Native Client.

Al realizar una actualización de Microsoft Data Access Components (MDAC) a SQL Server Native Client 10.0, también es posible que observe algunas diferencias de comportamiento. Para obtener más información, vea Actualizar una aplicación de MDCA a SQL Server Native Client.

Cambios de comportamiento en SQL Server Native Client 10.0

Descripción

OLE DB solo rellena los datos hasta la escala definida.

Para las conversiones en las que los datos convertidos se envían al servidor, SQL Server Native Client 10.0 solo rellena los datos con ceros a la derecha hasta la longitud máxima de los valores datetime. En SQL Server Native Client 9.0 y versiones anteriores, los datos se rellenaban hasta 9 dígitos.

Validación de DBTYPE_DBTIMESTAMP para ICommandWithParameter::SetParameterInfo.

SQL Server Native Client 10.0 implementa el requisito de OLE DB para bScale en ICommandWithParameter::SetParameterInfo de modo que se establezca en una precisión de fracciones de segundo para DBTYPE_DBTIMESTAMP.

El procedimiento almacenado sp_columns devuelve ahora "NO" en lugar de "NO " para la columna IS_NULLABLE.

En SQL Server Native Client 10.0, el procedimiento almacenado sp_columns devuelve ahora "NO" en lugar de "NO " para una columna IS_NULLABLE.

Ahora, SQLSetDescRec, SQLBindParameter y SQLBindCol realizan una comprobación de coherencia.

En versiones anteriores a SQL Server Native Client 10.0, el establecimiento de SQL_DESC_DATA_PTR no daba lugar a ninguna comprobación de coherencia para cualquier tipo de descriptor de SQLSetDescRec, SQLBindParameter o SQLBindCol.

Ahora, SQLCopyDesc realiza una comprobación de coherencia del descriptor.

En versiones anteriores a SQL Server Native Client 10.0, SQLCopyDesc no realizaba ninguna comprobación de coherencia cuando el campo SQL_DESC_DATA_PTR se establecía en un registro concreto.

SQLGetDescRec ya no realiza ninguna comprobación de coherencia del descriptor.

En versiones anteriores a SQL Server Native Client 10.0, SQLGetDescRec realizaba una comprobación de coherencia del descriptor cuando se establecía el campo SQL_DESC_DATA_PTR. Esto último no era un requisito de la especificación de ODBC y, en SQL Server Native Client 10.0, ya no se realiza esta comprobación de coherencia.

Se devuelve un error distinto cuando la fecha se encuentra fuera del intervalo.

Para el tipo datetime, SQL Server Native Client 10.0 devolverá un número de error distinto al que se devolvía en versiones anteriores para una fecha que se encuentre fuera del intervalo de fechas admitido.

Concretamente, SQL Server Native Client 9.0 devolvía 22007 para todos los valores de año fuera del intervalo en conversiones de cadenas a datetime, y SQL Server Native Client 10.0 devuelve 22008 cuando la fecha se encuentra dentro del intervalo admitido por datetime2 pero fuera del intervalo admitido por datetime o smalldatetime.

El valor datetime trunca las fracciones de segundo y no se redondea si el redondeo cambia el día.

En versiones anteriores a SQL Server Native Client 10.0, el comportamiento del cliente para los valores datetime que se enviaban al servidor era redondearlos a la fracción 1/300 de segundo más próxima. En SQL Server Native Client 10.0, este mismo escenario provoca un truncamiento de fracciones de segundo si al redondear cambia el día.

Posible truncamiento de segundos para el valor datetime.

Una aplicación compilada con SQL Server 2008 Native Client (o posterior) que se conecta a un servidor SQL Server 2005 (o anterior) truncará segundos y fracciones de segundo para la parte de hora de los datos enviados al servidor si se enlaza a una columna de fecha y hora con un identificador de tipo DBTYPE_DBTIMESTAMP (OLE DB) o SQL_TIMESTAMP (ODBC) y una escala de 0.

Por ejemplo:

Datos de entrada: 1994-08-21 21:21:36.000

Datos insertados: 1994-08-21 21:21:00.000

La conversión de datos OLE DB de DBTYPE_DBTIME a DBTYPE_DATE ya no puede hacer que cambie el día.

En versiones anteriores a SQL Server Native Client 10.0, si la parte correspondiente a la hora de DBTYPE_DATE se encontraba a medio segundo de la medianoche, el código de conversión de OLE DB hacía que el día cambiara. En SQL Server Native Client 10.0, el día no cambia (las fracciones de segundo se truncan y no se redondean).

Cambios de conversión de IBCPSession::BCColFmt.

En SQL Server Native Client 10.0, cuando se utiliza IBCPSession::BCOColFmt para convertir SQLDATETIME o SQLDATETIME en un tipo de cadena, se exporta un valor fraccionario. Por ejemplo, al convertir un tipo SQLDATETIME en un tipo SQLNVARCHARMAX, las versiones anteriores de SQL Server Native Client devolvían 

1989-02-01 00:00:00. SQL Server Native Client 10.0 devuelve 1989-02-01 00:00:00.0000000.

El tamaño de los datos enviados debe coincidir con la longitud especificada en SQL_LEN_DATA_AT_EXEC.

Cuando se utiliza SQL_LEN_DATA_AT_EXEC, el tamaño de los datos debe coincidir con la longitud especificada en SQL_LEN_DATA_AT_EXEC. Puede usar SQL_DATA_AT_EXEC, pero resulta mucho más ventajoso desde el punto de vista del rendimiento utilizar SQL_LEN_DATA_AT_EXEC.

Ahora, las aplicaciones personalizadas que utilizan la API de BCP pueden recibir una advertencia.

La API de BCP generará un mensaje de advertencia si la longitud de los datos es mayor que la longitud especificada en un campo para todos los tipos. Anteriormente, esta advertencia solo se recibía para los tipos de caracteres, pero no se emitía para todos los tipos.

Si se inserta una cadena vacía en un sql_variant enlazado como un tipo de fecha y hora, se genera un error.

En SQL Server Native Client 9.0, al insertar una cadena vacía en un sql_variant enlazado como un tipo de fecha y hora no se generaba ningún error. SQL Server Native Client 10.0 genera un error en esta situación.

Validación de parámetros SQL_C_TYPE_TIMESTAMP y DBTYPE_DBTIMESTAMP más estricta.

En versiones anteriores a SQL Server 2008 Native Client, los valores datetime se redondeaban para ajustarse a la escala de las columnas datetime y  smalldatetime mediante SQL Server. Ahora, SQL Server 2008 Native Client aplica reglas de validación más estrictas, que se definen en la especificación básica de ODBC para las fracciones de segundo. Si un valor de parámetro no puede convertirse en el tipo SQL utilizando la escala especificada o no puede implicarse mediante el enlace del cliente sin que se produzca un truncamiento de los dígitos finales, se devuelve un error.

SQL Server puede devolver resultados diferentes cuando se ejecuta un desencadenador.

Los cambios en SQL Server 2008 pueden hacer que una aplicación devuelva resultados diferentes de una instrucción que produjo la ejecución de un desencadenador cuando NOCOUNT OFF estaba activo. En esta situación, es posible que la aplicación genere un error. Para solucionar este error, establezca NOCOUNT ON en el desencadenador o llame a SQLMoreResults para pasar al resultado siguiente.

Historial de cambios

Contenido actualizado

Se ha agregado un elemento que describe cómo se pueden truncar los segundos para la columna datetime.