2011-10-09 16 views
10

LinkWykonanie jeśli @@ rowcount> 0 resetuje @@ rowcount do 0. Dlaczego?

@@ rowCount służy do informowania liczbę wierszy dotkniętych przez ostatni SELECT, INSERT, aktualizacji lub usuwania wypowiedzi

declare @row int select 100 if @@rowcount>0 set @[email protected]@rowcount ... 

Powyższy zwróci 0, ponieważ jak najszybciej if @@rowcount>0 jest wykonywane zostaje zresetowane do 0, ponieważ nie zwraca żadnych wierszy. Więc zawsze przypisać do zmienna pierwszy

Dlaczego oświadczenie if @@rowcount>0 zresetować @@rowcount do 0? Czy wartość @@rowcount nie ma wpływu tylko na polecenia select, insert, update i delete?

dziękuję

Odpowiedz

11

Wpływa na ostatnie oświadczenie. Jak tego oświadczenia SET

Declare @row int 
select 100 union all select 200 union all select 300 
set @row = @@rowcount; 
SELECT @row, @@rowcount 

Jeśli czytasz actual Microsoft SQL Server Docs on MSDN, daje przykłady tego, co wypowiedzi wpływają @@ROWCOUNT. Na przykład „takie jak” implikuje inne oświadczenia, gdyby również ustawić go na zero

zwrotów takich jak używane, ustawiamy <option>, deallocate kursorem, zamknąć kursor, rozpocząć transakcji lub dokonać transakcji wyzerować wartość ROWCOUNT 0.

+0

1 - O ile rozumiem, powodem, dla którego @@ rowcount zwrócił 1, a nie 0, jest zapytanie "SELECT @row, @@ rowcount" dotyczące jednego wiersza. Ale myślałem, że termin "liczba dotkniętych wierszy" był używany, gdy instrukcja sql zajmowała się rzeczywistymi wierszami w tabelach DB, ale twoja instrukcja select nie ma dostępu do żadnych wierszy, więc dlaczego @@ rowcount zwraca 1? – user702769

+0

2 - Mam nadzieję, że to pytanie ma jakiś sens - jeśli mielibyśmy uderzyć nosem, czy @@ rowcount nie zwróci liczby wierszy JUŻ dotkniętych przez instrukcję select? Jeśli tak, to "SELECT @row, @@ rowcount" powinno zwrócić 0 dla @@ rowcount, ponieważ instrukcja select nie jest jeszcze w pełni ukończona w momencie pobierania wartości z @ rowcount, a jako takie nie wpłynęły żadne wiersze jeszcze?! – user702769

+1

@ user702769: Poziom @@ rowcount w 'SELECT @row, @@ rowcount' jest zależny od' set @row = @@ rowcount; 'powyżej. SELECT nie może odczytać własnego @@ rowcount – gbn

0

Cóż, Mam do czynienia z podobnym problemem przy użyciu sybase, co oznacza, że ​​coś może być nie tak z "jeśli".

declare @counter1 int 
declare @counter2 int 

select @counter1 = @@rowcount 
if @@rowcount = 0 return 
select @counter2 = @@rowcount 

wyjście jest: counter1 = 3 counter2 = 0

by się spodziewać 3 (oryginalny) lub 1 (ze względu na WYBÓR).

Jest to tym bardziej dziwne, bo z http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc38151.1540/doc/html/san1278452893271.html

„The @@ ROWCOUNT jest nie wyzerowany przez każde oświadczenie, które nie wpływa na wiersze, takiego jak instrukcja if”. Z drugiej strony istnieje wiele nieporozumień, jak to naprawdę działa (na podstawie dyskusji w internecie)

Na koniec w moim roztworu w pierwszej linii przypisać do zmiennej @@ rowcount i moja logika opiera się na tej zmiennej

+0

Tak, byłem zaskoczony odkryciem (trudnym sposobem), że w SQL Server @@ rowcount jest resetowany przez instrukcję "if". –

Powiązane problemy