SET NOCOUNT Error al manejar la llamada SQL después de la actualización


13

Estamos actualizando nuestro entorno de prueba con un nuevo servidor y una versión actualizada de Microsoft SQL Server y hemos tenido un problema.

En el nuevo servidor, nuestro antiguo código obtendrá "no se permite la operación cuando el objeto está cerrado" al ejecutar algunos procedimientos almacenados. Este mensaje nunca apareció en el antiguo servidor. Cuando lo rastreamos, el problema se puede resolver agregando SET NOCOUNT ON;al procedimiento almacenado.

Observé los valores predeterminados en la base de datos y no vi configuraciones diferentes (SQL Server 2008 vs SQL Server 2014) relacionadas con los valores predeterminados.

¿Qué configuración debería tener en cuenta para resolver esto globalmente sin necesidad de agregar SET NOCOUNT ONa mil procesos almacenados?


2
Todos los procedimientos almacenados deben especificar el comportamiento en el que confía, que es mucho más seguro que confiar en las opciones del usuario. Incluso podría argumentar que cada procedimiento almacenado siempre debe comenzar con SET NOCOUNT ON;, siempre.
Aaron Bertrand

@AaronBertrand Estoy de acuerdo; el último proyecto en el que estuve tenía una plantilla que no había configurado, pero esa no es una opción en este proyecto en este momento
UnhandledExcepSean

Tenga en cuenta que puede escribir una secuencia de comandos para modificar todos los procedimientos almacenados y agregarlos SET NOCOUNT ON;al comienzo del procedimiento almacenado (después BEGIN). El número de procedimientos almacenados realmente no debería ser un problema.
Erik A

1
@ Erik-A: no puede estar seguro de que un procedimiento almacenado comience BEGIN, es bueno, pero no es obligatorio.
Max Vernon

Respuestas:


16

La configuración de SQL Server tiene una opción llamada, apropiadamente, user options , que se puede configurar usando el sp_configureprocedimiento almacenado del sistema. Escribí una publicación de blog sobre SQL Server Science que muestra cómo inspeccionar y configurar las opciones de usuario.

En resumen, puede obtener el "valor de configuración" del servidor anterior, usando esto:

EXEC sys.sp_configure 'user options';

Luego, configure el nuevo servidor para usar las mismas opciones a través de esto:

EXEC sys.sp_configure 'user options', <config value>;
RECONFIGURE

(reemplace el <valor de configuración> con el valor del servidor anterior).


Es casi seguro que sea la causa (esperando la confirmación ahora). El antiguo servidor tenía un valor de 512 que es NOCOUNT según MS ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). No vi esto antes, ya que solo estaba mirando @@ OPTIONS
UnhandledExcepSean

Eso es definitivamente correcto. Si SET NOCOUNT ONresuelve el problema, establecer las opciones de usuario en 512 lo solucionará.
Max Vernon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.