Inspiré par cette question où il y a des opinions divergentes sur SET NOCOUNT...
Faut-il utiliser SET NOCOUNT ON pour SQL Server ? Si non, pourquoi ?
Ce qu'il fait Edit 6, le 22 Jul 2011
Il supprime le message "xx lignes affectées" après tout DML. Il s'agit d'un jeu de résultats et lorsqu'il est envoyé, le client doit le traiter. C'est minuscule, mais mesurable (voir les réponses ci-dessous).
Pour les triggers, etc., le client recevra plusieurs "xx lignes affectées" et cela provoque toutes sortes d'erreurs pour certains ORM, MS Access, JPA, etc.
Le contexte :
La meilleure pratique généralement acceptée (je pensais jusqu'à cette question) est d'utiliser SET NOCOUNT ON
dans les déclencheurs et les procédures stockées de SQL Server. Nous l'utilisons partout et une rapide recherche sur Google montre que de nombreux MVPs SQL Server sont d'accord aussi.
MSDN dit que cela peut casser un .net SQLDataAdapter .
Cela signifie pour moi que l'adaptateur de données SQLDataAdapter est limité à un simple traitement CRUD car il s'attend à ce que le message "n lignes affectées" corresponde. Donc, je ne peux pas utiliser :
- IF EXISTS pour éviter les doublons (message no rows affected) Note : à utiliser avec précaution
- WHERE NOT EXISTS (moins de rangs que prévu)
- Filtrez les mises à jour triviales (par exemple, aucune donnée ne change réellement).
- Effectuer tout accès aux tables avant (comme la journalisation)
- Masquer la complexité ou la dénormalisation
- etc.
Dans la question, marc_s (qui connaît son SQL) dit de ne pas l'utiliser. Cela diffère de ce que je pense (et je me considère comme assez compétent en SQL aussi).
Il est possible que j'oublie quelque chose (n'hésitez pas à me faire remarquer ce qui est évident), mais qu'en pensez-vous ?
Note : cela fait des années que je n'ai pas vu cette erreur car je n'utilise plus SQLDataAdapter de nos jours.
Modifications après commentaires et questions :
Edit : Plus de pensées...
Nous avons plusieurs clients : l'un peut utiliser un SQLDataAdaptor en C#, un autre peut utiliser nHibernate depuis Java. Ceux-ci peuvent être affectés de différentes manières avec SET NOCOUNT ON
.
Si vous considérez les procs stockés comme des méthodes, il est alors malvenu (anti-modèle) de supposer qu'un traitement interne fonctionne d'une certaine manière pour vos propres besoins.
Edit 2 : a Question sur le déclenchement de nHibernate où SET NOCOUNT ON
ne peut pas être réglé
(et non, ce n'est pas un doublon de ce )
Edit 3 : Encore plus d'informations, grâce à mon collègue MVP
- KB 240882 problème de déconnexion sur SQL 2000 et antérieurs
- Démonstration du gain de performance
Edit 4 : 13 mai 2011
Casse aussi le SQL Linq 2 quand il n'est pas spécifié ?
Edit 5 : 14 Jun 2011
Casse JPA, proc stocké avec des variables de table : JPA 2.0 prend-il en charge les variables de table du serveur SQL ?
Edit 6 : 15 Aug 2011
La grille de données SSMS "Edit rows" nécessite SET NOCOUNT ON : Mise à jour du déclencheur avec GROUP BY
Edit 7 : 07 Mar 2013
Plus de détails en profondeur de @RemusRusanu :
Est-ce que SET NOCOUNT ON fait vraiment une grande différence en termes de performances ?