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

En este tema se describen los cambios importantes en SQL Server Native Client con respecto a SQL Server Native Client en SQL Server 2005.

Al realizar una actualización de Microsoft Data Access Components (MDAC) a SQL Server Native Client, 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 solamente 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 solamente rellena los datos con ceros a la derecha hasta la longitud máxima de los valores datetime. 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 truncación 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 enlaza con una columna de fecha datetime 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. SQL Server 2008 Native Client (y posteriores) 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 introducidos 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.