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?

dthrasher
quelle
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 .

OMG Ponys
quelle
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
Raj Mehr
quelle
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

Alter Pascalou
quelle
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.

Bob Mc
quelle
-2

WARNUNG: @@ROWCOUNTKann falsche Daten zurückgeben, wenn an die zu ändernde Tabelle Trigger angehängt sind!

Das @@ROWCOUNTgibt die Anzahl der vom TRIGGER betroffenen Datensätze zurück, nicht die tatsächliche Anweisung!

Michael Kingsford Gray
quelle
8
Es stellt sich heraus, dass dies nicht wahr ist: stackoverflow.com/questions/7005225/…
Tao