Comment puis-je obtenir le nombre d'enregistrements affectés par une procédure stockée?

86

Pour INSERT, UPDATEet les DELETEinstructions SQL exécutées directement sur la base de données, la plupart des fournisseurs de bases de données renvoient le nombre de lignes affectées. Pour les procédures stockées, le nombre d'enregistrements affectés est toujours -1.

Comment obtenir le nombre d'enregistrements affectés par une procédure stockée?

dthrasher
la source
1
Set No Count était aussi mon problème. Pour tester, exécutez votre procédure stockée dans Management Studio et voyez si vous obtenez des décomptes, si vous le faites, puis assurez-vous d'avoir une variable de sortie.
user2624356

Réponses:

80

Enregistrez un paramètre out pour la procédure stockée et définissez la valeur en fonction de l' @@ROWCOUNTutilisation de SQL Server. À utiliser SQL%ROWCOUNTsi vous utilisez Oracle.

Notez que si vous en avez plusieurs INSERT/UPDATE/DELETE, vous aurez besoin d'une variable pour stocker le résultat de @@ROWCOUNTchaque opération.

Poneys OMG
la source
46

@@RowCount vous donnera le nombre d'enregistrements affectés par une instruction SQL.

Le @@RowCountne fonctionne que si vous émettez immédiatement après. Donc, si vous interceptez des erreurs, vous devez le faire sur la même ligne. Si vous le divisez, vous manquerez celui que vous placerez en second.

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR

Si vous avez plusieurs instructions, vous devrez capturer le nombre de lignes affectées pour chacune et les additionner.

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR
Raj Plus
la source
33

Il s'avère que pour moi, cela a SET NOCOUNT ONété défini dans le script de procédure stockée (par défaut sur SQL Server Management Studio) et a SqlCommand.ExecuteNonQuery();toujours renvoyé -1.

Je viens de le déclencher: SET NOCOUNT OFFsans avoir besoin de l'utiliser @@ROWCOUNT.

Plus de détails trouvés ici: SqlCommand.ExecuteNonQuery () renvoie -1 lors de l'insertion / mise à jour / suppression

Mec Pascalou
la source
Cela fonctionne pour moi. Mon proc stocké est juste une simple instruction d'insertion, et cela semble fonctionner. Merci!
Harvey Darvey
Merci! Bon travail sur la référence.
Leo Gurdian
8

Pour Microsoft SQL Server, vous pouvez renvoyer la @@ROWCOUNTvariable pour renvoyer le nombre de lignes affectées par la dernière instruction de la procédure stockée.

Bob Mc
la source
-2

ATTENTION: @@ROWCOUNTpeut renvoyer de fausses données si la table en cours de modification est associée à des déclencheurs !

Le @@ROWCOUNTrenverra le nombre d'enregistrements affectés par le TRIGGER, pas l'instruction réelle!

Michael Kingsford Gray
la source
8
Il s'avère que ce n'est pas vrai: stackoverflow.com/questions/7005225/…
Tao