Na INSERT
, UPDATE
i DELETE
SQL wykonywanych bezpośrednio na bazie danych, większość dostawców baz danych zwróci liczbę wierszy. W przypadku procedur składowanych liczba rekordów, których to dotyczy, jest zawsze -1
.
Jak uzyskać liczbę rekordów, na które ma wpływ procedura składowana?
Odpowiedzi:
Zarejestruj parametr out dla procedury składowanej i ustaw wartość na podstawie tego,
@@ROWCOUNT
czy używasz programu SQL Server. Użyj,SQL%ROWCOUNT
jeśli używasz Oracle.Pamiętaj, że jeśli masz wiele
INSERT/UPDATE/DELETE
, będziesz potrzebować zmiennej do przechowywania wyniku@@ROWCOUNT
dla każdej operacji.źródło
@@RowCount
poda liczbę rekordów, na które ma wpływ instrukcja SQL.@@RowCount
Działa tylko wtedy, gdy wystawia go natychmiast potem. Więc jeśli wychwytujesz błędy, musisz to zrobić w tej samej linii. Jeśli to podzielisz, stracisz tę, którą umieścisz jako drugą.SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
Jeśli masz wiele instrukcji, będziesz musiał uchwycić liczbę wierszy, na które ma to wpływ, i dodać je.
SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR
źródło
Okazuje się, że
SET NOCOUNT ON
został ustawiony w skrypcie procedury składowanej (domyślnie w SQL Server Management Studio) iSqlCommand.ExecuteNonQuery();
zawsze zwracał -1.Po prostu to wyłączyłem:
SET NOCOUNT OFF
bez konieczności używania@@ROWCOUNT
.Więcej szczegółów można znaleźć tutaj: SqlCommand.ExecuteNonQuery () zwraca -1 podczas wykonywania operacji Wstaw / Aktualizuj / Usuń
źródło
W przypadku programu Microsoft SQL Server można zwrócić
@@ROWCOUNT
zmienną, aby zwrócić liczbę wierszy, na które ma wpływ ostatnia instrukcja procedury składowanej.źródło
@@LICZBA WIERSZY
źródło
OSTRZEŻENIE:
@@ROWCOUNT
może zwrócić fałszywe dane, jeśli zmieniana tabela ma dołączone wyzwalacze !@@ROWCOUNT
Zwróci liczbę rekordów dotkniętych przez spust, a nie rzeczywista oświadczenie!źródło