Contar el número de filas eliminadas en un procedimiento almacenado de SQL Server


En SQL Server 2005, ¿hay una forma de eliminar filas y saber cuántas se eliminaron realmente?

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

Mi primera suposición fue usar las variables @@ROWCOUNT, pero eso no está establecido, por ejemplo,

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

select @@ROWCOUNT 

Siempre devuelve un 0.

MSDN sugiere la OUTPUT construcción, 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?

Author: Sam, 2008-10-06

7 answers

¿has probado SET NOCOUNT OFF?

 50
Author: wcm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-25 11:42:01

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

 8
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-06 13:10:44

Solo haz esto:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

Donde p1 es el parámetro de salida establecido en el procedimiento almacenado. Espero que ayude.

 7
Author: Adly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-11 15:49:33

En su ejemplo @@ROWCOUNT debería funcionar - es una manera adecuada de encontrar un número de filas eliminadas. Si está intentando eliminar algo de su aplicación, deberá usar SET NOCOUNT ON

De acuerdo con MSDN La función @@ROWCOUNT se actualiza incluso cuando SET NOCOUNT está ACTIVADO, ya que SET NOCOUNT solo afecta al mensaje que recibe después de la ejecución.

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

 4
Author: Ilya Kochetov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-06 13:03:56

Encontré un caso en el que no puedes usar @@rowcount, como cuando quieres saber el recuento distinto de los valores que se eliminaron en lugar del recuento total. En este caso, usted tendría 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 debió a que output no incluía deleted antes del nombre del campo datefield.

 1
Author: James L.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-11 19:16:23

Por curiosidad, ¿cómo llamas al procedimiento? (Estoy asumiendo 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 which que en este caso sería una sola fila con una sola columna. En ADO.Net, el primero sería accedido por un parámetro y el segundo con un SqlDataReader. ¿Está, tal vez, confundiendo el valor de retorno del procedimiento con el rowcount?

 0
Author: Howard Pinsley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-08 15:18:59

Crear tabla temporal con una columna, id.

Inserte en la tabla temporal seleccionando los ID que desea eliminar. Eso te da tu cuenta.

Eliminar de la tabla donde id in (seleccionar id de la tabla temp)

 -1
Author: Corey Trager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-06 13:00:46