Frage

In SQL Server 2005, ist es eine Möglichkeit, Zeilen zu löschen und gesagt, wie viele wurden wirklich gelöscht?

Ich könnte einen select count(*) mit den gleichen Bedingungen zu tun, aber ich brauche diese absolut vertrauenswürdig.

Meine erste Vermutung war, die @@ROWCOUNT Variablen verwenden - aber das ist nicht festgelegt ist, z.B.

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

select @@ROWCOUNT 

gibt immer eine 0

MSDN schlägt die OUTPUT Konstruktion, zum Beispiel

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

select count(*) 
from #doomed

dies nicht gelingt tatsächlich mit einem Syntaxfehler.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Haben Sie versucht, SET NOCOUNT OFF?

Andere Tipps

I @@ ROWCOUNT für genau diesen Zweck in SQL2000 ohne Probleme verwenden. Stellen Sie sicher, dass Sie nicht versehentlich diese Zählung zurückzusetzen, bevor es überprüft, obwohl (BOL: 'Diese Variable wird auf 0 gesetzt, durch eine Anweisung, die keine Zeilen zurückgibt, wie eine IF-Anweisung).

Just dies zu tun:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

wobei p1 ist der Ausgangsparameter Sie in der gespeicherten Prozedur. Hoffe, es hilft.

In Ihrem Beispiel @@ROWCOUNT funktionieren soll - es ist eine richtige Art und Weise ist eine Reihe von gelöschten Zeilen zu erfahren. Wenn Sie versuchen, etwas aus Ihrer Anwendung zu löschen, dann werden Sie müssen SET NOCOUNT ON verwenden

Nach MSDN @@ ROWCOUNT-Funktion aktualisiert wird, selbst wenn SET NOCOUNT AN ist als SET NOCOUNT wirkt sich nur auf die Nachricht, die Sie das bekommen, nachdem die Ausführung.

Also, wenn Sie versuchen, mit den Ergebnissen der @@ROWCOUNT arbeiten von zum Beispiel ADO.NET dann sollte SET NOCOUNT ON auf jeden Fall helfen.

fand ich einen Fall, in dem Sie nicht @@rowcount verwenden können, wie wenn man die Anzahl der eindeutigen Werte die Werte wissen wollen, dass anstelle der Gesamtzahl gelöscht wurden. In diesem Fall würden Sie tun müssen, die folgenden:

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

select count(distinct datefield)
from #doomed

Die Syntaxfehler im OP war, weil output nicht deleted vor dem datefield Feldnamen enthalten.

Aus Neugier, wie nennen Sie das Verfahren? (Ich gehe davon aus es eine gespeicherte Prozedur ist?). Der Grund, warum ich frage ist, dass es einen Unterschied zwischen einer Rückgabewert der gespeicherten Prozedur (die 0 in diesem Fall wäre), und ein Rowset Ergebnis - die in diesem Fall eine einzelne Zeile mit einer einzigen Spalte wären. In ADO.Net würde die erstere durch einen Parameter, und die letztere mit einem SqlDataReader zugegriffen werden. Sind Sie vielleicht zu verkennen das Verfahren der Rückgabewert als rowcount?

Erstellen Sie temporäre Tabelle mit einer Spalte, id.

Einfügen in temp-Tabelle Auswahl der ids Sie löschen möchten. Das gibt Ihnen Ihre Zählung.

Löschen von Ihrem Tisch, an dem ID in (select id aus temporärer Tabelle)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top