SQL Server Bug: A floating point exception occurred in the user process. Current transaction is canceled
Hoy en el trabajo un usuario reportó un error que se disparaba en su aplicativo que corre sobre SQL Server 2000 SP3a. El error es de aquellos que en cierto modo ya estaba desesperando a los chicos de soporte de aplicaciones, y motivos han de tener pues cuando me escalaron el tema verifiqué que se trataba de un bug en SQL Server 2000. El mensaje de error es el siguiente (seguido de código T-SQL de UPDATE con filtros usando subconsultas el cual no indico por confidencialidad):
Server: Msg 3628, Level 16, State 1, Line 1
A floating point exception occurred in the user process. Current transaction is canceled.
Microsoft sospecha/indica que el problema se presenta cuando se trabaja con consultas INSERT, UPDATE o DELETE que operan en tablas que se hacen referencia a alguna vista indizada donde se puede encontrar una excepción de punto flotante durante la optimización. Para solucionar el problema recomienda actualizar/aplica el correspondiente Service Pack 4 para SQL Server 2000. Decidí no aplicar dicha recomendación y buscarle otra solución, el impacto de aplicar sería demasiado pues el SP4 en mi experiencia me ha dado problemas en temas de replicaciones, y actualmente tengo estos servidores en replicación a entornos SQL Server 2000 y SQL Server 2005.
Revisando un poco más a fondo el tema detecté que el UPDATE que menciono más arriba disparaba un trigger y dentro de ella se disparaba un stored procedure en la cual pude encontrar el trozo exacto de código que era otro UPDATE y donde se disparaba el error. Sospeché que el problema podría ser por daños en la tabla, para ello revisé la integridad física y lógica de las tablas, sin resultados que me indicará algún daño o corrupción. Comprobé una vez más que el DBCC CHECKDB (en SQL Server 2000) no siempre indicaba problemas de integridad.
El paso siguiente era comprobar la funcionalidad de cada columna, para ellos hice operaciones de update para cada columna, y detecté que estaban corruptas las columnas float donde se realizaba un UPDATE. Por lo tanto, no me quedó duda alguna que las páginas de una de las tablas estaban corruptas. Como paso final y para solucionar el problema apliqué un DBCC DBREINDEX(nombre_tabla_afectada) para reordenar físicamente las páginas de la tabla pues tiene índice CLUSTERED. Espero sirva a muchos!.
PercyReyes,