42 votes

La fonction "SET NOCOUNT OFF" est-elle nécessaire dans une procédure stockée ?

J'ai de nombreuses procédures qui ont set nocount on .

Est-il nécessaire de le désactiver à la fin de la procédure stockée ?

par exemple :

create procedure DummyProc
as
begin
    set nocount on
    ...
    set nocount off
end

1 votes

C'est une bonne pratique de programmation, oui.

8 votes

Je pense que la question est plutôt "En quoi le fait de le laisser on affecter les SQL ultérieurs" n'est-ce pas ?

15 votes

Remarque complémentaire : il n'est pas nécessaire de réinitialiser le paramètre défini à la fin de la procédure. Tous les set dans une procédure ne durent qu'à l'intérieur de cette procédure.

44voto

Jerad Rose Points 5960

set nocount on désactivera le X rows affected. le message que SQL renvoie. Ce message est supprimé, dans certains cas, en raison d'effets indésirables sur le client qui exécute la procédure stockée.

set nocount off annulera cette suppression. Cependant, set nocount on est un paramètre du champ d'application et, par défaut, sera de toute façon désactivé lorsque l'on quittera le champ d'application.

Maintenant, est-ce que set nocount off nécessaire ? Non, car toute nouvelle commande exécutée le sera dans un autre champ d'application, et par défaut set nocount off est toujours en vigueur. Mais comme indiqué ci-dessus dans les commentaires, il est considéré comme une bonne pratique d'indiquer explicitement que ce paramètre reviendra à la normale lorsque l'exécution de la procédure sera terminée.

4 votes

Il est intéressant de noter qu'il n'y a pas de "set nocount off" dans les modèles de procédure stockée qui sont générés dans SQL Management Studio en sélectionnant "Create new Stored Procedure" (Créer une nouvelle procédure stockée).

0 votes

En ce qui concerne les effets indésirables sur les clients, un exemple est le pilote JDBC - le nombre de lignes interfère avec la récupération des ensembles de résultats via JDBC.

2 votes

Il est préférable de diffuser une bonne connaissance du scoping. Sinon, quelle serait la "bonne" façon d'interpréter/écrire ceci : set nocount on; ..; if x = 1 return 1; set nocount off ? Il n'y a pas de bonne solution sans comprendre le comportement du scoping et l'appliquer correctement.

8voto

John Mitchell Points 123

Je sais que cet article est assez ancien, mais c'est le premier résultat que j'ai trouvé sur Google lorsque j'ai cherché la réponse. La réponse ci-dessus de le tester était une très bonne idée.

J'ai testé cette méthode et j'ai voulu mettre à jour les informations ci-dessus avec quelques détails supplémentaires.

Le champ d'application que vous créez avec un SET NOCOUNT ON s'étend à toutes les procs que votre procédure appelle. Ainsi, si votre procédure effectue un SET NOCOUNT ON et que vous appelez ensuite un sproc, ce dernier reçoit votre paramètre SET NOCOUNT. Le paramètre disparaît lorsque vous quittez votre sproc, mais il est transmis aux sprocs appelées. Si vous définissez NOCOUNT à l'intérieur de la sproc appelée, la sproc externe aura le paramètre SET NOCOUNT qu'elle a défini et la sproc interne n'affectera pas la sproc externe.

Je pense donc que vous n'avez pas vraiment besoin de le réinitialiser à la fin de votre sproc parce que vos paramètres ne sortiront jamais de votre sproc vers le haut ; cependant, si votre sproc dépend du paramètre, il devrait le définir avant d'en avoir besoin parce que s'il est appelé par une autre sproc, il pourrait avoir un paramètre différent de celui que vous supposez.

4voto

Royi Namir Points 34397

Seulement si vous ne voulez pas voir

(1 row(s) affected) // or n rows....

la plupart du temps - lorsque vous déboguez

et vous utilisez la commande print - vous voulez donc voir votre propre texte pur... c'est donc une bonne pratique.

éditer

cela n'affecte pas le résultat de votre recherche (activé ou désactivé - cela n'a pas d'importance) - si c'est ce que vous demandez. ( merci JNK).

1 votes

-1 - Ne répond pas à la question. Il demande "Est-ce que cela affectera d'autres SQL exécutés après la procédure stockée", et non pas "Que fait nocount ?".

9 votes

Mais cela ne répond toujours pas à sa question. Il veut savoir si le fait de ne pas le remettre en marche aura une incidence sur tout ce qui est exécuté après la procédure.

1voto

Emre Points 21

C'est simple, vous n'en avez pas besoin si un autre programme exécute votre procédure. Disons que mon code python appelle une procédure mssql, alors je n'ai pas besoin du nombre de lignes affectées dans mon application, donc je "DEVRAIS" absolument mettre "set nocount on" dans mon code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X