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
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
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.
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).
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.
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.
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.
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 - 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 ?".
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.
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.0 votes
@GSerg - postez-le s'il vous plaît. C'est la réponse et je te donne un upvote :)
0 votes
Il en va de même pour la question de la
set nocount off
oset nocount on
? Ma réponse était basée sur la question initiale, mais Adam l'a modifiée par la suite - était-ce basé sur des hypothèses ? Il s'agit de deux questions totalement différentes.1 votes
Pour information, j'ai annulé le changement de titre d'Adam, car dans le corps de la question, il est clair que le PO posait la question suivante
set nocount off
.0 votes
@MichaelFredrickson - Je sais que c'est ce que dit BOL mais ce n'est pas vrai. testez-le !