Domanda

In SQL Server 2005 esiste un modo per eliminare le righe e sapere quanti sono stati effettivamente ?

Potrei fare un select count (*) con le stesse condizioni, ma ho bisogno che questo sia assolutamente affidabile.

La mia prima ipotesi è stata quella di utilizzare le variabili @@ ROWCOUNT , ma questo non è impostato, ad es.

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

select @@ROWCOUNT 

restituisce sempre uno 0.

MSDN suggerisce la costruzione OUTPUT , per esempio

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

select count(*) 
from #doomed

questo in realtà fallisce con un errore di sintassi.

Qualche idea?

È stato utile?

Soluzione

Hai provato SET NOCOUNT OFF ?

Altri suggerimenti

Uso @@ ROWCOUNT per questo preciso scopo in SQL2000 senza problemi. Assicurati di non reimpostare inavvertitamente questo conteggio prima di verificarlo (BOL: "Questa variabile è impostata su 0 da qualsiasi istruzione che non restituisce righe, come un'istruzione IF").

Basta fare questo:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

dove p1 è il parametro di output impostato nella procedura memorizzata. Spero che sia d'aiuto.

Nel tuo esempio @@ ROWCOUNT dovrebbe funzionare - è un modo corretto per scoprire un numero di righe eliminate. Se stai tentando di eliminare qualcosa dalla tua applicazione, dovrai utilizzare IMPOSTA NOCOUNT ON

Secondo MSDN @@ ROWCOUNT la funzione viene aggiornata anche quando SET NOCOUNT è ON poiché SET NOCOUNT ha effetto solo sul messaggio che ricevi dopo l'esecuzione.

Quindi, se stai cercando di lavorare con i risultati di @@ ROWCOUNT da, ad esempio, ADO.NET, SET NOCOUNT ON dovrebbe sicuramente aiutare.

Ho trovato un caso in cui non è possibile utilizzare @@ rowcount , ad esempio quando si desidera conoscere il conteggio distinto dei valori che sono stati eliminati anziché il conteggio totale. In questo caso dovresti fare quanto segue:

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

select count(distinct datefield)
from #doomed

L'errore di sintassi nell'OP era dovuto al fatto che output non includeva eliminato prima del nome del campo datefield .

Per curiosità, come stai chiamando la procedura? (Suppongo sia una procedura memorizzata?). Il motivo per cui chiedo è che esiste una differenza tra il valore restituito di una procedura memorizzata (che sarebbe 0 in questo caso) e un risultato del set di righe - che in questo caso sarebbe una singola riga con una singola colonna. In ADO.Net, il primo sarebbe accessibile da un parametro e il secondo con un SqlDataReader. Forse stai confondendo il valore restituito della procedura come il conteggio delle righe?

Crea una tabella temporanea con una colonna, id.

Inserisci nella tabella temporanea selezionando gli ID che desideri eliminare. Questo ti dà il tuo conto.

Elimina dalla tabella in cui si trova l'id (seleziona l'id dalla tabella temporanea)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top