Inspiriert von dieser Frage, wo es unterschiedliche Ansichten zu SET NOCOUNT gibt ...
Sollten wir SET NOCOUNT ON für SQL Server verwenden? Wenn nicht, warum nicht?
Was es macht Edit 6, am 22. Juli 2011
Es unterdrückt die Meldung "xx Zeilen betroffen" nach jeder DML. Dies ist eine Ergebnismenge, die der Client beim Senden verarbeiten muss. Es ist winzig, aber messbar (siehe Antworten unten)
Bei Triggern usw. erhält der Client mehrere "betroffene xx Zeilen", was bei einigen ORMs, MS Access, JPA usw. zu allen möglichen Fehlern führt (siehe Änderungen unten).
Hintergrund:
Allgemein anerkannte Best Practice (ich dachte bis zu dieser Frage) ist die Verwendung SET NOCOUNT ON
in Triggern und gespeicherten Prozeduren in SQL Server. Wir verwenden es überall und ein kurzer Blick auf Google zeigt, dass auch viele SQL Server-MVPs zustimmen.
MSDN sagt, dass dies einen .net SQLDataAdapter beschädigen kann .
Für mich bedeutet dies, dass der SQLDataAdapter auf die einfache CRUD-Verarbeitung beschränkt ist, da erwartet wird, dass die Nachricht "n betroffene Zeilen" übereinstimmt. Also kann ich nicht verwenden:
- WENN EXISTIERT, um Duplikate zu vermeiden (keine Zeilen betroffene Nachricht) Hinweis: Mit Vorsicht verwenden
- WO NICHT EXISTIERT (weniger Zeilen als erwartet
- Filtern Sie triviale Updates heraus (z. B. ändern sich keine Daten tatsächlich)
- Führen Sie vorher einen Tabellenzugriff durch (z. B. Protokollierung).
- Komplexität oder Denormierung verbergen
- usw
In der Frage sagt marc_s (wer kennt sich mit SQL aus), benutze es nicht. Dies unterscheidet sich von dem, was ich denke (und ich betrachte mich auch als etwas kompetent in SQL).
Es ist möglich, dass mir etwas fehlt (zögern Sie nicht, auf das Offensichtliche hinzuweisen), aber was denken Sie da draußen?
Hinweis: Es ist Jahre her, seit ich diesen Fehler gesehen habe, weil ich SQLDataAdapter heutzutage nicht mehr verwende.
Änderungen nach Kommentaren und Fragen:
Edit: Mehr Gedanken ...
Wir haben mehrere Clients: Einer kann einen C # SQLDataAdaptor verwenden, ein anderer kann nHibernate von Java verwenden. Diese können mit auf unterschiedliche Weise beeinflusst werden SET NOCOUNT ON
.
Wenn Sie gespeicherte Prozesse als Methoden betrachten, ist es eine schlechte Form (Anti-Pattern) anzunehmen, dass einige interne Verarbeitungen für Ihre eigenen Zwecke auf eine bestimmte Weise funktionieren.
Edit 2: Ein Trigger, der die nHibernate-Frage bricht , wo SET NOCOUNT ON
nicht gesetzt werden kann
(und nein, es ist kein Duplikat davon )
Edit 3: Noch mehr Infos, danke an meinen MVP-Kollegen
- KB 240882 , Problem, das bei SQL 2000 und früheren Versionen zu Verbindungsabbrüchen führt
- Demo des Leistungsgewinns
Bearbeiten 4: 13 Mai 2011
Bricht Linq 2 SQL auch, wenn nicht angegeben?
Bearbeiten 5: 14 Jun 2011
Bricht JPA ab, gespeicherter Prozess mit Tabellenvariablen: Unterstützt JPA 2.0 SQL Server-Tabellenvariablen?
Bearbeiten 6: 15 Aug 2011
Das SSMS-Datenraster "Zeilen bearbeiten" erfordert SET NOCOUNT ON: Trigger mit GROUP BY aktualisieren
Bearbeiten 7: 07 Mar 2013
Ausführlichere Details von @RemusRusanu: Macht SET NOCOUNT ON wirklich einen so großen Leistungsunterschied aus?