2008-10-06 17 views
42

W programie SQL Server 2005 istnieje sposób usuwania wierszy i informowania o liczbie usuniętych faktycznie?Zliczanie liczby usuniętych wierszy w procedurze przechowywanej programu SQL Server

Mogę zrobić select count(*) w tych samych warunkach, ale muszę to być całkowicie godne zaufania.

Moim pierwszym domysłem było użycie zmiennych @@ROWCOUNT - ale to nie jest ustawione, np.

delete 
from mytable 
where datefield = '5-Oct-2008' 

select @@ROWCOUNT 

zawsze zwraca 0.

MSDN proponuje konstrukcję OUTPUT, np

delete from mytable 
where datefield = '5-Oct-2008' 
output datefield into #doomed 

select count(*) 
from #doomed 

to faktycznie kończy się niepowodzeniem z błędem składni.

Wszelkie pomysły?

Odpowiedz

47

Czy próbowałeś SET NOCOUNT OFF?

+0

Myślałem, że próbowałem tego - ale najwyraźniej nie miałem, ponieważ działało jak urok - dzięki. – Unsliced

+1

MSDN wydaje się mówić SET NOCOUNT wpływa na wydruk. Dlaczego ma to wpływ na '@@ ROWCOUNT'? Czy nie powinien zawsze zwracać liczby usuniętych wierszy (w PO)? – noelicus

+0

*** To przypuszczenie *** Myślę, że to dlatego, że ustawienie NOCOUNT na mówi systemowi, że nie musi śledzić liczników, aby poprawić wydajność. – wcm

0

Utwórz tabelę tymczasową z jedną kolumną, id.

Włóż do tabeli tymczasowej wybierając identyfikatory, które chcesz usunąć. To daje ci liczbę.

Usuń ze swojego stołu, gdzie id w (SELECT id z tabeli temp)

+1

Chociaż coś, co zadziałałoby, narzut na coś takiego jest stratą czasu. –

+0

To rzeczywiście daje złą wydajność, zapytanie powinno trwać co najmniej 2 razy dłużej, co może zająć dużo czasu w przypadku obsługi wielu rekordów. Twórcze myślenie! –

3

W twoim przykładzie powinien działać @@ROWCOUNT - jest to właściwy sposób na znalezienie liczby usuniętych wierszy. Jeśli próbujesz usunąć coś z aplikacji wtedy musisz użyć SET NOCOUNT ON

Według MSDN @@ ROWCOUNT funkcja jest aktualizowana nawet przy ustawieniu NOCOUNT jest włączony jako SET NOCOUNT tylko wpływa na wiadomość dostaniesz po wykonaniu .

Więc jeśli próbujesz pracować z wynikami @@ROWCOUNT z, na przykład, ADO.NET, to zdecydowanie powinno pomóc SET NOCOUNT ON.

8

Używam @@ ROWCOUNT do tego celu w SQL2000 bez żadnych problemów. Upewnij się, że przypadkowo nie zresetowałeś tej liczby przed jej sprawdzeniem (BOL: "Ta zmienna jest ustawiona na 0 przez dowolną instrukcję, która nie zwraca wierszy, na przykład instrukcję JEŻELI").

0

Z ciekawości, jak się nazywa procedura? (Zakładam, że jest to procedura przechowywana?). Powód, dla którego pytam, jest taki, że istnieje różnica między wartością zwracaną procedury składowanej (która w tym przypadku wynosiłaby 0), a wynikiem zestawu zestawów wierszy - który w tym przypadku byłby pojedynczym wierszem z jedną kolumną. W ADO.Net, pierwszy będzie dostępny przez parametr, a drugi za pomocą SqlDataReader. Być może mylisz wartość zwracaną przez procedurę jako liczbę wierszy?

+0

To był kod w jednym miejscu (ale tak, w procedurze przechowywanej) - kasowałem niektóre dane, a następnie zapisywałem ten fakt do tabeli statusu, więc nie było tak naprawdę przypadku pomylenia wartości zwracanych. – Unsliced

7

Wystarczy to zrobić:

SET NOCOUNT off ; 
SELECT @p1 = @@ROWCOUNT 

gdzie p1 jest parametr wyjściowy ustawiony w procedurze przechowywanej. Mam nadzieję, że to pomaga.

1

Znalazłem przypadek, w którym nie można użyć numeru @@rowcount, tak jak w przypadku, gdy chcesz poznać liczbę różnych wartości, które zostały usunięte zamiast całkowitej liczby.W tym przypadku trzeba by wykonać następujące czynności:

delete from mytable 
where datefield = '5-Oct-2008' 
output deleted.datefield into #doomed 

select count(distinct datefield) 
from #doomed 

Błąd składni w PO dlatego output nie obejmują deleted przed nazwą datefield pola.

Powiązane problemy