Compter le nombre de lignes supprimées dans une procédure stockée SQL Server
Dans SQL Server 2005, il est un moyen de suppression de lignes et dit combien ont été fait supprimé?
Je pourrais faire un select count(*)
avec les mêmes conditions, mais j'ai besoin de cela pour être tout à fait digne de confiance.
Ma première hypothèse était d'utiliser le @@ROWCOUNT
variables - mais qui n'est pas défini, par exemple
delete
from mytable
where datefield = '5-Oct-2008'
select @@ROWCOUNT
renvoie toujours 0.
MSDN suggère la SORTIE
de la construction, par exemple
delete from mytable
where datefield = '5-Oct-2008'
output datefield into #doomed
select count(*)
from #doomed
cela échoue avec une erreur de syntaxe.
Des idées?
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé
SET NOCOUNT OFF
?@@ROWCOUNT
? Ne devrait-il pas toujours de retourner le nombre de lignes supprimées (dans l'OP)?J'utilise @@ROWCOUNT pour cet objectif précis dans SQL2000 sans problèmes. Assurez-vous que vous n'êtes pas accidentelle de réinitialiser ce compteur avant de vérifier si (BOL: 'Cette variable est définie à 0 par une déclaration qui n'a pas de retourner les lignes, comme une instruction if').
Viens de le faire:
où p1 est le paramètre de sortie défini dans la procédure stockée.
Espérons que cela aide.
Dans votre exemple
@@ROWCOUNT
travail - c'est un bon moyen de trouver un certain nombre de lignes supprimées. Si vous essayez de supprimer quelque chose à partir de votre application, puis vous aurez besoin d'utiliserSET NOCOUNT ON
Selon MSDN fonction @@ROWCOUNT est mis à jour même lorsque SET NOCOUNT est SUR que
SET NOCOUNT
n'affecte que le message que vous obtenez après l'exécution.Donc, si vous êtes en essayant de travailler avec les résultats de
@@ROWCOUNT
à partir, par exemple, ADO.NET puisSET NOCOUNT ON
devrait certainement aider.J'ai trouvé un cas où vous ne pouvez pas utiliser
@@rowcount
, comme lorsque vous voulez savoir le comptage des valeurs qui ont été supprimés au lieu de le comptage total. Dans ce cas, vous devez faire ce qui suit:L'erreur de syntaxe dans l'OP était parce que
output
ne comprennent pasdeleted
avant ladatefield
nom de champ.Par curiosité, comment êtes-vous l'appel de la procédure? (Je suppose que c'est une procédure stockée?). La raison pour laquelle je demande, c'est que il y a une différence entre une procédure stockée la valeur de retour (ce qui serait 0 dans ce cas), et un ensemble de lignes de résultat, qui serait dans ce cas une seule ligne avec une seule colonne. Dans ADO.Net, l'ancien serait accessible par un paramètre et le dernier avec un SqlDataReader. Êtes-vous, peut-être, se méprendre sur la procédure de la valeur de retour comme le nombre de lignes?
Créer temp tableau avec une colonne id.
Insérer dans la table temporaire de la sélection de l'id que vous souhaitez supprimer. Que vous donne votre compte.
Supprimer à partir de votre table where id in (select id from table temporaire)