2012-08-06 4 views
27

Was ist der Umfang von @@rowcount? MSDN erwähnt seinen Umfang nicht.Umfang von @@ rowcount?

Gibt die Anzahl der Zeilen zurück, die von der letzten Anweisung betroffen sind.

Ok.

In meinem SP - ich füge in eine Tabelle ein, die eine hat, die eine andere Einfügung tut, wenn ein neuer Wert in die Tabelle eingefügt wird.

Frage:

Welchen Umfang die @@rowcount beziehen? (Auslöser oder SP)?

Antwort

20

Zugegeben, der Artikel ist für SQL Server 2000, aber man würde hoffen, dass der Bereich zwischen den Versionen nicht ändert. Laut Artikel How triggers affect ROWCOUNT and IDENTITY in SQL Server 2000 wird @@ROWCOUNT nicht durch Trigger beeinflusst werden.

Im Einzelnen:

Es ist sicher @@ ROWCOUNT in SQL Server 2000 zu verwenden, auch wenn es ein Trigger auf der Basistabelle ist. Der Auslöser wird Ihre Ergebnisse nicht verzerren. Sie werden bekommen, was Sie erwarten. @@ ROWCOUNT funktioniert auch dann korrekt, wenn NOCOUNT gesetzt ist.

Wenn Sie also drei Zeilen aktualisieren, und die Trigger-Updates fünf Reihen an anderer Stelle finden Sie eine @@ROWCOUNT von 3.

auch erhalten, von GBN Antwort in SQL Server - is using @@ROWCOUNT safe in multithreaded applications?:

@@ ROWCOUNT ist sowohl für den Umfang als auch für die Verbindung sicher.

In Wirklichkeit liest es nur die letzte Anweisungszeilenanzahl für diese Verbindung und diesen Bereich.

+0

Vielen Dank für diese Erklärung! –

11

jeder insert/update/select/Satz/Anweisung löschen setzt die @@rowcount auf die Zeilen von der ausgeführten Anweisung betroffen

begin 
declare @myrowcount int, 
    @myrowcount2 int 
insert stmt 
SET @[email protected]@rowcount 
if @myrowcount>0 
begin 
insert stmt 
SET @myrowcount2 [email protected]@rowcount 
if @myrowcount2 >0 
do smthg 
end 
end 

oder versuchen, diese

SELECT * FROM master.sys.objects -- 50 rows 
    IF (1=1) 
     SELECT @@ROWCOUNT AS RowsAffected -- 0, because the IF did not affect any rows 

auch eine IF-Anweisung wirkt es .... daher ist sein Umfang die letzte Aussage gelesen.