Question

Dans SQL Server 2005, existe-t-il un moyen de supprimer des lignes et d'indiquer combien d'entre elles ont été réellement supprimées?

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

Ma première hypothèse é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 de la SORTIE . , 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?

Était-ce utile?

La solution

Avez-vous essayé SET NOCOUNT OFF ?

Autres conseils

J'utilise @@ ROWCOUNT à cette fin dans SQL2000 sans aucun problème. Veillez toutefois à ne pas réinitialiser ce nombre par inadvertance avant de le vérifier (BOL: 'Cette variable est définie sur 0 par toute instruction ne renvoyant pas de lignes, telle qu'une instruction IF').

Faites 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 ça aide.

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

.

Selon la MSDN , la fonction @@ ROWCOUNT est mise à jour même lorsque SET NOCOUNT est activé car SET NOCOUNT n’affecte que le message que vous recevez après l’exécution.

Donc, si vous essayez d'utiliser les résultats de @@ ROWCOUNT de ADO.NET, par exemple, SET NOCOUNT ON devrait certainement vous aider.

J'ai trouvé un cas où vous ne pouvez pas utiliser @@ rowcount , par exemple lorsque vous souhaitez 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 la sortie n'incluait pas supprimé 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 pose la question 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 dernier avec un SqlDataReader. Peut-être confondez-vous la valeur de retour de la procédure avec le nombre de lignes?

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

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

Supprimer de votre table où id est entré (sélectionnez l'id de la table temporaire)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top