web-dev-qa-db-fra.com

Comptage du nombre de lignes supprimées dans une procédure stockée SQL Server

Dans SQL Server 2005, existe-t-il un moyen de supprimer des lignes et de savoir combien ont été réellement supprimés?

Je pourrais faire une select count(*) avec les mêmes conditions, mais j'ai besoin que cela soit tout à fait fiable.

Ma première supposition a été d'utiliser le @@ROWCOUNT variables - mais qui ne sont pas définies, par exemple.

delete 
from mytable 
where datefield = '5-Oct-2008' 

select @@ROWCOUNT 

renvoie toujours un 0.

MSDN suggère la construction OUTPUT , par exemple.

delete from mytable 
where datefield = '5-Oct-2008' 
output datefield into #doomed

select count(*) 
from #doomed

cela échoue en fait avec une erreur de syntaxe.

Des idées?

46
Unsliced

As-tu essayé SET NOCOUNT OFF?

51
wcm

J'utilise @@ ROWCOUNT à cette fin exacte dans SQL2000 sans aucun problème. Assurez-vous cependant que vous ne réinitialisez pas ce nombre par inadvertance avant de le vérifier (BOL: 'Cette variable est définie sur 0 par toute instruction qui ne renvoie pas de lignes, telle qu'une instruction IF').

10
Simon

Faites juste ceci:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

où p1 est le paramètre de sortie que vous avez défini dans la procédure stockée. J'espère que cela aide.

7
Adly

Dans votre exemple @@ROWCOUNT devrait fonctionner - c'est un bon moyen de trouver un certain nombre de lignes supprimées. Si vous essayez de supprimer quelque chose de votre application, vous devrez utiliser SET NOCOUNT ON

Selon MSDN @@ La fonction ROWCOUNT est mise à jour même lorsque SET NOCOUNT est ON en tant que SET NOCOUNT affecte uniquement le message que vous obtenez après l'exécution.

Donc, si vous essayez de travailler avec les résultats de @@ROWCOUNT depuis, par exemple, ADO.NET puis SET NOCOUNT ON devrait certainement aider.

5
Ilya Kochetov

J'ai trouvé un cas où vous ne pouvez pas utiliser @@rowcount, comme lorsque vous voulez connaître le nombre distinct de valeurs supprimées au lieu du nombre total. Dans ce cas, vous devrez procéder comme suit:

delete from mytable 
where datefield = '5-Oct-2008' 
output deleted.datefield into #doomed

select count(distinct datefield)
from #doomed

L'erreur de syntaxe dans l'OP était due au fait que output n'incluait pas deleted avant le nom du champ datefield.

1
James L.

Par curiosité, comment appelez-vous la procédure? (Je suppose que c'est une procédure stockée?). La raison pour laquelle je demande est qu'il existe une différence entre la valeur de retour d'une procédure stockée (qui serait 0 dans ce cas) et un résultat d'ensemble de lignes - qui dans ce cas serait une seule ligne avec une seule colonne. Dans ADO.Net, le premier serait accessible par un paramètre et le second avec un SqlDataReader. Êtes-vous peut-être en train de confondre la valeur de retour de la procédure avec le nombre de lignes?

0
Howard Pinsley