2011-12-20 20 views
17

Mam procedura składowana, która usuwa niektóre rekordy. Potrzebuję uzyskać liczbę usuniętych rekordów.Jak mogę uzyskać liczbę usuniętych rekordów?

starałem się zrobić to tak:

DELETE FROM OperationsV1.dbo.Files WHERE FileID = @FileID 
SELECT @@ROWCOUNT AS DELETED;    

Ale usunięta pokazany jako 0, choć odpowiednie zapisy zostaną usunięte. Próbowałem SET NOCOUNT OFF; bezskutecznie. Czy mógłbyś mi pomóc? Dzięki.

+1

Co zrobić z wartości można uzyskać z '@@ ROWCOUNT'? Czy chcesz go zwrócić? Może być konieczne użycie 'DECLARE @DeleteCnt INT; SELECT @DeleteCnt = @@ ROWCOUNT', aby przechwycić wartość do zmiennej, którą następnie możesz zwrócić lub wstawić do tabeli kontroli lub coś w tym stylu. –

Odpowiedz

24

To powinno działać poprawnie. Ustawienie NOCOUNT jest nieistotne.

Czy masz jakieś oświadczenia między tymi dwoma, które pokazałeś? @@ROWCOUNT jest resetowany po każdym wyciągu, więc musisz natychmiast pobrać wartość bez żadnych instrukcji.

+0

Nie, nie ma nic pomiędzy. –

+0

Jak testujesz to? W Management Studio? –

+5

Przepraszam, to był mój błąd. Dodałem SELECT @@ ROWCOUNT AS DELETED; po błędnej instrukcji Delete. –

-5
START TRANSACTION; 
SELECT @before:=(SELECT count(*) FROM OperationsV1.dbo.Files); 
DELETE FROM OperationsV1.dbo.Files WHERE FileID = @FileID; 
SELECT @after:=(SELECT count(*) FROM OperationsV1.dbo.Files); 
COMMIT; 
SELECT @[email protected] AS DELETED; 

nie wiem o serwerze SQL, ale w MySQL SELECT count(*) FROM ... jest niezwykle tania eksploatacja.

+0

Dzięki Eugen. Zobaczmy, czy ktoś może wyjaśnić, dlaczego @@ ROWCOUNT nie działa dla mnie. Użyję twojego rozwiązania, jeśli nikt nie pomoże na @@ ROWCOUNT. –

+2

Na domyślnym poziomie izolacji transakcji, nadal pozwalałoby to na kolejne kasowanie, aby zmienić liczbę w połowie tego zapytania. – Andomar

+7

@David - Nie używaj tego. Jest to drogie i ma warunki wyścigowe. –

1

Używam tego fragmentu kodu podczas debugowania procedur przechowywanych w celu zweryfikowania liczby po operacjach, takich jak usuwanie:

DELCARE @Msg varchar(30) 
... 
SELECT @Msg = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' rows affected' 
RAISERROR (@Msg, 0, 1) WITH NOWAIT 
Powiązane problemy