Wie kann ich die Anzahl der Datensätze ermitteln, die von einer gespeicherten Prozedur betroffen sind?


85

Für INSERT, UPDATEund DELETESQL - Anweisungen direkt an der Datenbank ausgeführt, kehren die meisten Datenbankanbieter die Anzahl der betroffenen Zeilen. Bei gespeicherten Prozeduren beträgt die Anzahl der betroffenen Datensätze immer -1.

Wie erhalten wir die Anzahl der Datensätze, die von einer gespeicherten Prozedur betroffen sind?


1
Set No Count war auch mein Problem. Führen Sie zum Testen Ihre gespeicherte Prozedur in Management Studio aus und prüfen Sie, ob Sie Zählungen erhalten. Stellen Sie dann sicher, dass Sie eine Ausgabevariable haben.
user2624356

Antworten:


80

Registrieren Sie einen out-Parameter für die gespeicherte Prozedur und legen Sie den Wert basierend auf der @@ROWCOUNTVerwendung von SQL Server fest. Verwenden SQL%ROWCOUNTSie diese Option, wenn Sie Oracle verwenden.

Beachten Sie, dass Sie bei mehreren Vorgängen INSERT/UPDATE/DELETEeine Variable benötigen, um das Ergebnis @@ROWCOUNTfür jede Operation zu speichern .


46

@@RowCount gibt Ihnen die Anzahl der Datensätze an, die von einer SQL-Anweisung betroffen sind.

Das @@RowCountfunktioniert nur, wenn Sie es unmittelbar danach ausstellen. Wenn Sie also Fehler einfangen, müssen Sie dies in derselben Zeile tun. Wenn Sie es aufteilen, verpassen Sie das, was Sie an zweiter Stelle setzen.

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR

Wenn Sie mehrere Anweisungen haben, müssen Sie die Anzahl der betroffenen Zeilen für jede erfassen und addieren.

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR

33

Es stellt sich für mich heraus, dass dies SET NOCOUNT ONim Skript für gespeicherte Prozeduren festgelegt wurde (standardmäßig in SQL Server Management Studio) und SqlCommand.ExecuteNonQuery();immer -1 zurückgegeben hat.

Ich habe es einfach ausgelöst: SET NOCOUNT OFFohne es benutzen zu müssen @@ROWCOUNT.

Weitere Details finden Sie hier: SqlCommand.ExecuteNonQuery () gibt beim Einfügen / Aktualisieren / Löschen -1 zurück


Das funktioniert bei mir. Mein gespeicherter Prozess ist nur eine einfache Einfügeanweisung und scheint zu funktionieren. Vielen Dank!
Harvey Darvey

Vielen Dank! Gute Arbeit an der Referenz.
Leo Gurdian

8

Für Microsoft SQL Server können Sie die @@ROWCOUNTVariable zurückgeben, um die Anzahl der Zeilen zurückzugeben, die von der letzten Anweisung in der gespeicherten Prozedur betroffen sind.



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.