Ir al contenido principal

ExecuteNonQuery devuelve -1 si se indica SET NOCOUNT ON

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.

¿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 ON
Esa 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

Entradas populares de este blog

Aprendiendo a usar LEFT OUTER JOIN

En esta entrada pretendemos explicar los diferentes resultados obtenidos por distintas construcciones de consultas que, aparentemente, deberían producir el mismo conjunto de resultados. Así, veremos las diferencias entre filtrar los resultados de una query en la unión (Join) mediante condiciones ON y mediante cláusulas WHERE.

Script para obtener el tamaño de todas las tablas de la base de datos

En algunas ocasiones podemos vernos con la necesidad de conocer qué tablas de nuestra base de datos están ocupando más espacio en disco. Por ejemplo, si disponemos de SQL Server Express , cuyas bases de datos están limitadas a 4GB o 10GB, según la versión que estemos usando -4, hasta 2005; 10, a partir de 2008-, aparte de usar las opciones de comprimir la base de datos, poner el log en el modo simple de recuperación o ajustar las políticas de crecimiento automático de nuestros ficheros, podemos necesitar averiguar qué tablas crecen más para tomar las decisiones oportunas.

Cómo averiguar el propietario (Owner) de una base de datos en SQL Server

En ocasiones necesitamos conocer quién es el propietario de una base de datos . Normalmente podemos acceder a esta información a través del SQL Server Management Studio , consultando las propiedades de la base de datos. Para ello, buscamos la base de datos que queramos consultar en el árbol de bases de datos del Object Explorer y hacemos clic derecho sobre ella. A continuación, elegimos la última opción del menú contextual que nos aparece: Propiedades . Veremos esta ventana: Propiedades de una base de datos, que incluyen el propietario (en amarillo) Sin embargo, en ocasiones no tenemos acceso a esta ventana de propiedades o, simplemente, queremos consultar el propietario de todas las bases de datos de un servidor. Para ello disponemos del siguiente script T-SQL , que nos proporcionará la información deseada: La primera columna nos dirá el propietario de la base de datos (en concreto, su login o nombre de usuario). A partir de este script , podemos filtrar por base de dat...