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 d'indiquer le nombre réellement supprimé?

Je pourrais faire un select count(*) avec les mêmes conditions, mais j'ai besoin que ce soit totalement digne de confiance.

Ma première supposition était d'utiliser les variables @@ROWCOUNT – mais cela n'est pas défini, 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 réellement avec une erreur de syntaxe.

Des idées?

Avez-vous essayé SET NOCOUNT OFF ?

J'utilise @@ ROWCOUNT pour ce but précis dans SQL2000 sans problèmes. Assurez-vous de ne pas réinitialiser ce count 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").

Fais 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.

Dans votre exemple, @@ROWCOUNT devrait fonctionner – c'est un bon moyen de find 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 @@ ROWCOUNT fonction est mise à jour même lorsque SET NOCOUNT est ON car 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 partir de, par exemple, ADO.NET, alors SET NOCOUNT ON devrait certainement aider.

J'ai trouvé un cas où vous ne pouvez pas utiliser @@rowcount , comme lorsque vous voulez connaître le nombre distinct des valeurs qui ont été supprimées au lieu du nombre total. Dans ce cas, vous devrez faire ce qui 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 parce que la output n'a pas inclus deleted avant le nom du champ datefield .

Créer une table temporaire avec une colonne, id.

Insérer dans la table temporaire en sélectionnant les identifiants que vous voulez supprimer. Cela vous donne votre count.

Supprimer de votre table où id dans (select id de la table temporaire)

Par curiosité, comment appelez-vous la procédure? (Je suppose que c'est une procédure stockée?). La raison pour laquelle je request est qu'il existe une différence entre la valeur de return d'une procédure stockée (qui serait 0 dans ce cas) et un résultat d'set de lignes – qui dans ce cas serait une seule ligne avec une seule colonne. Dans ADO.Net, le premier accède à un paramètre et le second à un SqlDataReader. Est-ce que vous confondez peut-être la valeur de return de la procédure avec le nombre de lignes?