Ejecutando un procedimiento almacenado que, a su vez llamaba a un método en un assembly instalado en el CLR de SQL Server, obtenía un error inesperado. El error me decía que una de las instrucciones SQL ejecutadas dentro del assembly estaba fallando. Sin embargo, si omitía el procesamiento del error, me daba cuenta de que la sentencia se había ejecutado correctamente.
La sentencia en el assembly se estaba ejecutando mediante el método ExecuteNonQuery de la clase SQLCommand de ADO.NET. Según la MSDN, este método devuelve siempre el número de filas afectadas para instrucciones del tipo UPDATE, INSERT o DELETE. En mi caso se trataba de un UPDATE. Sin embargo, el valor devuelto siempre era -1, lo que el código del assembly procesaba como un error, ya que se esperaba afectar siempre a un registro de la base de datos.
Intentando averiguar las causas del porqué de dicho -1, encontré este artículo, en el que se explica muy claramente el motivo del valor negativo devuelto:
Asegurándonos de poner SET NOCOUNT OFF delante de la llamada al método del assembly, ¡problema resuelto!
¿Qué estaba ocurriendo?
La sentencia en el assembly se estaba ejecutando mediante el método ExecuteNonQuery de la clase SQLCommand de ADO.NET. Según la MSDN, este método devuelve siempre el número de filas afectadas para instrucciones del tipo UPDATE, INSERT o DELETE. En mi caso se trataba de un UPDATE. Sin embargo, el valor devuelto siempre era -1, lo que el código del assembly procesaba como un error, ya que se esperaba afectar siempre a un registro de la base de datos.
Intentando averiguar las causas del porqué de dicho -1, encontré este artículo, en el que se explica muy claramente el motivo del valor negativo devuelto:
SET NOCOUNT ONEsa instrucción, habitual en los procedimientos almacenados, normalmente escrita al principio de los mismos, sirve para evitar que SQL Server nos devuelva la cuenta de filas afectadas por cada operación ejecutada en el procedimiento. Se evitan así dos cosas:
- Interferir en los resultados devueltos
- Mejorar el rendimiento del procedimiento almacenado, sobre todo si el número de sentencias ejecutadas es elevado.
Asegurándonos de poner SET NOCOUNT OFF delante de la llamada al método del assembly, ¡problema resuelto!
Comentarios
Publicar un comentario