web-dev-qa-db-fra.com

Portée de @@ rowcount?

Quelle est la portée de @@rowcount? MSDN ne mentionne pas sa portée.

Renvoie le nombre de lignes affectées par la dernière instruction.

D'accord.

Dans mon SP - j'insère dans une table, qui a un insert trigger qui fait un autre insertion lorsqu'une nouvelle valeur est insérée dans la table.

Question:

Dans quelle mesure le @@rowcount fera référence? (déclencheur ou SP)?

28
Royi Namir

Certes, l'article concerne SQL Server 2000, mais on espère que la portée ne change pas entre les versions. Selon l'article Comment les déclencheurs affectent ROWCOUNT et IDENTITY dans SQL Server 20 , @@ROWCOUNT ne sera pas affecté par les déclencheurs.

Plus précisément:

Il est sûr d'utiliser @@ ROWCOUNT dans SQL Server 2000 même lorsqu'il y a un déclencheur sur la table de base. Le déclencheur ne faussera pas vos résultats; vous obtiendrez ce que vous attendez. @@ ROWCOUNT fonctionne correctement même lorsque NOCOUNT est défini.

Donc, si vous mettez à jour trois lignes et que le déclencheur met à jour cinq lignes ailleurs, vous obtiendrez un @@ROWCOUNT sur 3.

En outre, à partir de la réponse de GBN dans SQL Server - utilise @@ ROWCOUNT en toute sécurité dans les applications multithread? :

@@ ROWCOUNT est à la fois sûr pour la portée et la connexion.

En fait, il lit uniquement le dernier nombre de lignes d'instruction pour cette connexion et cette étendue.

20
LittleBobbyTables

chaque instruction insert/update/select/set/delete réinitialise le @@rowcount aux lignes affectées par l'instruction exécutée

begin
declare @myrowcount int,
    @myrowcount2 int
insert stmt
SET @myrowcount=@@rowcount
if @myrowcount>0
begin
insert stmt
SET @myrowcount2 =@@rowcount
if @myrowcount2 >0
do smthg
end
end

ou essayez ceci

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

même une instruction IF l'affecte ... d'où sa portée est la dernière instruction lue.

12
NG.