2009-07-29 14 views
75

Dla instrukcji SQL wykonywanych bezpośrednio w bazie danych większość dostawców baz danych zwraca liczbę wierszy, których dotyczy problem. W przypadku procedur składowanych liczba rekordów dotyczy zawsze -1.Jak mogę uzyskać liczbę rekordów, na które ma wpływ procedura składowana?

Jak uzyskać liczbę rekordów objętych procedurą przechowywaną?

+1

Ustaw nr Hrabia był mój problem, jak również. Aby przetestować, wykonaj swoją procedurę przechowywaną w studio zarządzania i sprawdź, czy masz rachunki, jeśli to zrobisz, upewnij się, że masz wynik zmienny. – user2624356

Odpowiedz

74

Zarejestruj parametr wyjściowy dla procedury przechowywanej i ustawić wartość na podstawie @@ROWCOUNT przypadku korzystania z SQL Server. Użyj SQL%ROWCOUNT, jeśli używasz Oracle.

Pamiętaj, że jeśli masz wiele numerów INSERT/UPDATE/DELETE, dla każdej operacji będziesz potrzebować zmiennej do zapisania wyniku z @@ROWCOUNT.

8

W przypadku serwera Microsoft SQL Server można zwrócić zmienną @@ ROWCOUNT, aby zwrócić liczbę wierszy, których dotyczy ostatnia instrukcja w procedurze przechowywanej.

41

@@RowCount podaje liczbę rekordów, na które wpływa instrukcja SQL.

Urządzenie @@RowCount działa tylko wtedy, gdy wydasz je natychmiast. Jeśli więc przechwytujesz błędy, musisz zrobić to w tej samej linii. Jeśli to rozdzielisz, stracisz szansę na to, które postawisz na drugim miejscu.

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

Jeśli masz wiele instrukcji, musisz przechwycić liczbę wierszy, których dotyczy każdy z nich i dodać je.

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

OSTRZEŻENIE: @@ROWCOUNT może powrócić fałszywe danych, jeśli tabela jest zmieniony został wyzwala z nim związane!

Numer @@ROWCOUNT zwróci liczbę rekordów, których dotyczy TRIGGER, a nie faktyczne wyciągi!

+8

Okazało się, że to nie jest prawda: http://stackoverflow.com/questions/7005225/sql-server-does-trigger-affects-rowcount – Tao

25

Okazuje się, że SET NOCOUNT ON został ustawiony w skrypcie procedury składowanej (domyślnie w SQL Server Management Studio) i SqlCommand.ExecuteNonQuery(); zawsze zwracane -1.

Po prostu ustawiłem: SET NOCOUNT OFF bez potrzeby używania @@ROWCOUNT. Znaleziono tu

Więcej szczegółów: SqlCommand.ExecuteNonQuery() returns -1 when doing Insert/Update/Delete

+0

To działa dla mnie. Mój zapisany proces to proste instrukcje wstawiania i wygląda na to, że działa. dzięki! –

+0

Dzięki! Dobra robota na referencji. –

Powiązane problemy