SET NOCOUNT Erreur dans la gestion de l'appel SQL après la mise à niveau

13

Nous mettons à niveau notre environnement de test avec un nouveau serveur et une version mise à jour de Microsoft SQL Server et avons rencontré un problème.

Sur le nouveau serveur, notre ancien code obtiendra "l'opération n'est pas autorisée lorsque l'objet est fermé" lors de l'exécution de certaines procédures stockées. Ce message n'est jamais apparu sur l'ancien serveur. Lorsque nous l'avons retrouvé, le problème peut être résolu en ajoutant SET NOCOUNT ON;à la procédure stockée.

J'ai regardé les valeurs par défaut de la base de données et je n'ai vu aucun paramètre différent (SQL Server 2008 vs SQL Server 2014) lié aux valeurs par défaut.

Quel paramètre dois-je envisager pour résoudre ce problème à l'échelle mondiale sans avoir à ajouter SET NOCOUNT ONà un millier de procs stockés?

UnhandledExcepSean
la source
2
Toutes les procédures stockées doivent spécifier le comportement sur lequel vous comptez, ce qui est beaucoup plus sûr que de compter sur les options utilisateur. Je dirais même potentiellement que chaque procédure stockée devrait toujours commencer par SET NOCOUNT ON;, toujours.
Aaron Bertrand
@AaronBertrand Je suis d'accord; le dernier projet sur lequel je
travaillais
Notez que vous pouvez écrire un script pour modifier toutes les procédures stockées et l'ajouter SET NOCOUNT ON;au début de la procédure stockée (après BEGIN). Le nombre de procédures stockées ne devrait pas vraiment être un problème.
Erik A
1
@ Erik-A - vous ne pouvez pas être certain qu'une procédure stockée commence par BEGIN- c'est bien, mais pas obligatoire.
Max Vernon

Réponses:

16

La configuration de SQL Server possède une option appelée, de manière appropriée user options, qui peut être définie à l'aide de la sp_configureprocédure stockée système. J'ai écrit un article de blog sur SQL Server Science montrant comment inspecter et définir les options utilisateur.

En bref, vous pouvez obtenir la "valeur de configuration" de l'ancien serveur, en utilisant ceci:

EXEC sys.sp_configure 'user options';

Ensuite, configurez le nouveau serveur pour utiliser les mêmes options via ceci:

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

(remplacez la <valeur de configuration> par la valeur de l'ancien serveur).

Max Vernon
la source
C'est presque certainement la cause (en attente de confirmation maintenant). L'ancien serveur avait une valeur de 512 qui est NOCOUNT selon MS ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). Je n'ai pas vu cela plus tôt car je ne regardais que @@ OPTIONS
UnhandledExcepSean
C'est tout à fait correct. Si SET NOCOUNT ONle problème est résolu, la définition des options utilisateur sur 512 le résoudra.
Max Vernon