2008-10-06 18 views
42

En SQL Server 2005, ¿hay alguna forma de eliminar filas y saber cuántas se borraron realmente ?Contando el número de filas eliminadas en un procedimiento almacenado de SQL Server

Podría hacer un select count(*) con las mismas condiciones, pero necesito que esto sea completamente confiable.

Mi primera suposición fue utilizar las variables @@ROWCOUNT, pero eso no está configurado, p.

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

select @@ROWCOUNT 

siempre devuelve un 0.

MSDN sugiere la construcción OUTPUT, por ejemplo

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

select count(*) 
from #doomed 

esto realmente falla con un error de sintaxis.

¿Alguna idea?

Respuesta

47

¿Usted ha intentado SET NOCOUNT OFF?

+0

Pensé que había intentado esto, pero aparentemente no lo había hecho porque funcionaba como un amuleto, gracias. – Unsliced

+1

MSDN parece decir que SET NOCOUNT afecta la impresión. ¿Por qué esto afecta a '@@ ROWCOUNT'? ¿No debería devolver siempre el número de filas eliminadas (en el OP)? – noelicus

+0

*** Esta es una conjetura *** Creo que es porque al configurar NOCOUNT le dice al sistema que no tiene que hacer un seguimiento de los recuentos para hacer las cosas más eficientes – wcm

0

Crear tabla temporal con una columna, id.

Insertar en la tabla temporal seleccionando los identificadores que desea eliminar. Eso te da tu cuenta.

eliminar de la tabla donde id en (seleccione ID de tabla temporal)

+1

Aunque algo funcionaría, la sobrecarga de algo así es un desperdicio. –

+0

Esto daría un mal rendimiento de hecho, la consulta tomaría al menos 2 veces más, lo que podría ser un tiempo considerable si está manejando muchos registros. pensamiento creativo sin embargo! –

3

En su ejemplo, @@ROWCOUNT debería funcionar: es una forma adecuada de averiguar una serie de filas eliminadas. Si usted está tratando de eliminar algo de su aplicación, entonces usted tendrá que utilizar SET NOCOUNT ON

Según MSDN función @@ ROWCOUNT se actualiza incluso cuando SET NOCOUNT está activado como SET NOCOUNT sólo afecta al mensaje que aparece después de la ejecución .

Así que si está tratando de trabajar con los resultados de @@ROWCOUNT de, por ejemplo, ADO.NET, entonces SET NOCOUNT ON definitivamente debería ayudar.

8

Utilizo @@ ROWCOUNT para este propósito exacto en SQL2000 sin problemas. Sin embargo, asegúrese de no reiniciar accidentalmente este conteo antes de comprobarlo (BOL: 'Esta variable se establece en 0 por cualquier instrucción que no devuelva filas, como una instrucción IF').

0

Por curiosidad, ¿cómo llamas el procedimiento? (¿Asumo que es un procedimiento almacenado?). La razón por la que pregunto es que hay una diferencia entre el valor de retorno de un procedimiento almacenado (que sería 0 en este caso) y un resultado de conjunto de filas, que en este caso sería una sola fila con una sola columna. En ADO.Net, se accederá a la primera mediante un parámetro y la segunda con un SqlDataReader. ¿Está, quizás, confundiendo el valor de retorno del procedimiento con el recuento de filas?

+0

Este era el código en un solo lugar (pero sí, en un procedimiento almacenado) - Borré algunos datos y luego escribí ese hecho en una tabla de estado, por lo que no fue realmente un caso de confusión sobre los valores devueltos. – Unsliced

7

a hacer esto:

SET NOCOUNT off ; 
SELECT @p1 = @@ROWCOUNT 

donde p1 es el parámetro de salida se establece en el procedimiento almacenado. Espero que ayude.

1

Encontré un caso en el que no puede usar @@rowcount, como cuando desea saber el recuento distinto de los valores que se eliminaron en lugar del recuento total.En este caso se tiene que hacer lo siguiente:

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

select count(distinct datefield) 
from #doomed 

El error de sintaxis en el OP se debía a que no incluyó outputdeleted antes del nombre datefield campo.

Cuestiones relacionadas