Quelques doutes m'assaillant depuis mon post sur cette variable, j'ai réalisé quelques tests très simples et consulté notre bible à tous..la MSDN :-)
Voici l'exemple très simple (la table T1 contient 5 lignes) :
DECLARE @i INT
SET @i = 5
SELECT * FROM T1
IF(@i = 5)
BEGIN
PRINT 'OK'
PRINT @@ROWCOUNT
END
ELSE
BEGIN
PRINT 'KO'
PRINT @@ROWCOUNT
END
END
Et le résultat :
(5 ligne(s) affectée(s))
OK
0
L'instruction IF renvoie donc O (ce qui paraît logique).
Je n'ajoute pas de PRINT @@ROWCOUNT avant ce IF car le PRINT affecterais la valeur 0 à notre variable (je l'ai fait au préalable de cet exemple pour vérifier que l'on ai bien la valeur 5 renvoyé).
De la même manière les instructions de type
-
d'affectation (SET, SELECT sans requêtes comme SELECT GETDATE()) renvoient un @@ROWCOUNT = 1
-
toute requête de sélection ou retour de fonction renvoient un @@ROWCOUNT = nombre de lignes affectées
-
EXECUTE permet de conserver la valeur antérieure de @@ROWCOUNT
-
Les débuts et commit de transaction réinitialisent notre @@ROWCOUNT à 0
Enfin notons que l'instruction SET ROWCOUNT int permet de définir le nombre de lignes maximum traitées par une requête. Dès que int est atteint, le moteur arrête de traiter le reste de la requête (incluant triggers et les types de curseurs KEYSET et INSENSITIVE).
Pour terminer avec ce ROWCOUNT, notons également le ROWCOUNT_BIG() qui renvoie un BIGINT au lieu d'un INT pour les valeurs > 2 milliards