Für INSERT
, UPDATE
und DELETE
SQL - 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?
Antworten:
Registrieren Sie einen out-Parameter für die gespeicherte Prozedur und legen Sie den Wert basierend auf der
@@ROWCOUNT
Verwendung von SQL Server fest. VerwendenSQL%ROWCOUNT
Sie diese Option, wenn Sie Oracle verwenden.Beachten Sie, dass Sie bei mehreren Vorgängen
INSERT/UPDATE/DELETE
eine Variable benötigen, um das Ergebnis@@ROWCOUNT
für jede Operation zu speichern .quelle
@@RowCount
gibt Ihnen die Anzahl der Datensätze an, die von einer SQL-Anweisung betroffen sind.Das
@@RowCount
funktioniert 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.Wenn Sie mehrere Anweisungen haben, müssen Sie die Anzahl der betroffenen Zeilen für jede erfassen und addieren.
quelle
Es stellt sich für mich heraus, dass dies
SET NOCOUNT ON
im Skript für gespeicherte Prozeduren festgelegt wurde (standardmäßig in SQL Server Management Studio) undSqlCommand.ExecuteNonQuery();
immer -1 zurückgegeben hat.Ich habe es einfach ausgelöst:
SET NOCOUNT OFF
ohne es benutzen zu müssen@@ROWCOUNT
.Weitere Details finden Sie hier: SqlCommand.ExecuteNonQuery () gibt beim Einfügen / Aktualisieren / Löschen -1 zurück
quelle
Für Microsoft SQL Server können Sie die
@@ROWCOUNT
Variable zurückgeben, um die Anzahl der Zeilen zurückzugeben, die von der letzten Anweisung in der gespeicherten Prozedur betroffen sind.quelle
@@REIHENANZAHL
quelle
WARNUNG:
@@ROWCOUNT
Kann falsche Daten zurückgeben, wenn an die zu ändernde Tabelle Trigger angehängt sind!Das
@@ROWCOUNT
gibt die Anzahl der vom TRIGGER betroffenen Datensätze zurück, nicht die tatsächliche Anweisung!quelle