2009-06-15 8 views
16

Ich erstelle eine gespeicherte Prozedur in Sql Server 2008-Datenbank. Ich möchte die Anzahl der betroffenen Zeilen zurückgeben. Welches ist eine bessere Option SET NOCOUNT OFF oder RETURN @@ ROWCOUNT?SET NOCOUNT AUS oder RETURN @@ ROWCOUNT?

Ich weiß, dass beide funktionieren, aber welche ist eine bessere Wahl und warum?

Nach einigen Versuchen komme ich zu einer Schlussfolgerung, dass SET NOCOUNT in gespeicherten Prozeduren standardmäßig deaktiviert ist. Ist es möglich, dieses Verhalten in meiner Datenbank zu ändern?

Antwort

23

Verwenden Sie @@ RowCount. Es ist explizit und transparent und wird vollständig von Ihrem Code und nicht von einem integrierten Verhalten gesteuert.

Die Option NOCOUNT kann manuell auf den Standardwert ON gesetzt werden (Optionen> Abfrageausführung> SQL Server> Erweitert). Wenn Sie es auf diese Weise festlegen, aber dann SET NOCOUNT OFF in Ihrer gespeicherten Prozedur deklarieren, hat diese lokale Einstellung Vorrang.

4

Ich weiß, dass mit Set NOCOUNT ON ein DataAdapter denken würde, dass es einen Parallelitätskonflikt gab.

Sie können read about it on MSDN. Wenn der Code von DataAdapters verwendet wird, verwenden Sie offensichtlich SET NOCOUNT ON nicht.

Es sieht aus wie SqlCommand also has this behaviour, was ich denke, ist der Grund, warum der DataAdapter ein Problem hat (wie unter der Haube wird es ein Command-Objekt verwenden).

+0

Ich sehe nichts über SET NOCOUNT in der SqlCommand-Dokumentation erwähnt. Sind Sie sicher, dass es das gleiche Problem wie bei DataAdapters gibt? – niaher

+1

Google it- Sie werden viele Beweise finden, dass es tut: http://www.google.co.uk/search?client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&channel=s&hl=de&q=ExecuteNonQuery+ NoCount & meta = & btnG = Google + Suche. Ich kann nicht sicher sein, dass es das gleiche Problem wie DataAdapters ist, ohne es zu testen, aber ich sehe nicht, warum es einen anderen Grund geben würde. – RichardOD

5

Verwenden Sie RETURN nicht für Werte. Nach Konvention ist RETURN von gespeicherten Prozeduren für Fehlercodes vorgesehen, wobei 0 bedeutet, dass kein Fehler vorliegt, und nicht 0, was eine Art von Problem bedeutet. Wenn Sie Daten zurück benötigen, müssen Sie dies mit einem OUTPUT-Parameter tun. Es ist ein wenig kontraintuitiv, basierend auf der Verwendung der Rückkehr anderer Sprachen.

+0

Es gibt einen Grund dafür: Zuletzt habe ich überprüft, RETURN ist auf shortint-Werte beschränkt, dh der maximale Rückgabewert ist 65535. – enorl76

2

Gründe für SET NOCOUNT ON/OFF Verwendung:

den Stapelüberlauf zu steuern, während Zeilen in eine Tabelle eingefügt wird. Übergabe der T-Sql-Nachrichten während der Ausführung der Abfragen oder verschachtelten Abfragen. Zum Anzeigen oder Anzeigen der zuletzt ausgeführten Abfragen. Um Informationen über die neueste Rekordeskalation zu erhalten.

0

Warum verwenden wir SET NOCOUNT on/off ---

Antwort: wir dies durch folgende Schritte verstehen

Schritt 1: Ausführen Abfrage "Wählen Sie Top-10 * von Tabellenname" .

Schritt 2: Öffnen Sie das Meldungsfenster, es zeigt eine Meldung "10 Zeilen betroffen". Es erzeugt zusätzliche Gemeinkosten und verlängert unsere Ausführungszeit.

Schritt 3: Um diesen zusätzlichen Overhead zu überwinden, verwenden wir SET NOCOUNT ON. Wenn es aktiviert ist, zählt es nie die Anzahl der Zeilen zurück, sondern sendet eine Nachricht, die erfolgreich ausgeführt wurde.

Schritt 4: Standardmäßig ist NOCOUNT ON, dann zählt es die Anzahl der zurückgegebenen Zeilen, deshalb mein Vorschlag, dass es beim Erstellen neuer Prozeduren ausgeschaltet werden sollte, um bessere Leistung vom Datenbankserver zu erhalten.