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?
As-tu essayé SET NOCOUNT OFF
?
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').
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.
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.
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
.
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?