Jak mogę uzyskać liczbę rekordów, na które ma wpływ procedura składowana?

86

Na INSERT, UPDATEi DELETESQL 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?

dthrasher
źródło
1
Set No Count też był moim problemem. Aby przetestować, wykonaj procedurę składowaną w Management Studio i sprawdź, czy otrzymujesz liczby, a jeśli tak, upewnij się, że masz zmienną wyjściową.
user2624356

Odpowiedzi:

80

Zarejestruj parametr out dla procedury składowanej i ustaw wartość na podstawie tego, @@ROWCOUNTczy używasz programu SQL Server. Użyj, SQL%ROWCOUNTjeśli używasz Oracle.

Pamiętaj, że jeśli masz wiele INSERT/UPDATE/DELETE, będziesz potrzebować zmiennej do przechowywania wyniku @@ROWCOUNTdla każdej operacji.

Kucyki OMG
źródło
46

@@RowCount poda liczbę rekordów, na które ma wpływ instrukcja SQL.

@@RowCountDział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
Raj Więcej
źródło
33

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

Po prostu to wyłączyłem: SET NOCOUNT OFFbez konieczności używania @@ROWCOUNT.

Więcej szczegółów można znaleźć tutaj: SqlCommand.ExecuteNonQuery () zwraca -1 podczas wykonywania operacji Wstaw / Aktualizuj / Usuń

Koleś Pascalou
źródło
To działa dla mnie. Mój zapisany proces to po prostu proste instrukcje wstawiania i wydaje się, że działa. dzięki!
Harvey Darvey
Dzięki! Dobra robota na referencji.
Leo Gurdian
8

W przypadku programu Microsoft SQL Server można zwrócić @@ROWCOUNTzmienną, aby zwrócić liczbę wierszy, na które ma wpływ ostatnia instrukcja procedury składowanej.

Bob Mc
źródło
-2

OSTRZEŻENIE: @@ROWCOUNTmoże zwrócić fałszywe dane, jeśli zmieniana tabela ma dołączone wyzwalacze !

@@ROWCOUNTZwróci liczbę rekordów dotkniętych przez spust, a nie rzeczywista oświadczenie!

Michael Kingsford Gray
źródło
8
Okazuje się, że to nieprawda: stackoverflow.com/questions/7005225/ ...
Tao