Contar el número de filas eliminadas en un procedimiento almacenado de SQL Server
-
05-07-2019 - |
Pregunta
En SQL Server 2005, ¿hay alguna forma de eliminar filas y de que se le diga cuántas se eliminaron en realidad ?
Podría hacer un select count (*)
con las mismas condiciones, pero necesito que esto sea absolutamente confiable.
Mi primera suposición fue utilizar 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 construcción de OUTPUT
, p.ej
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?
Solución
¿Has probado con SET NOCOUNT OFF
?
Otros consejos
Utilizo @@ ROWCOUNT para este propósito exacto en SQL2000 sin problemas. Asegúrate de no reiniciar sin querer este recuento antes de verificarlo (BOL: 'Esta variable se establece en 0 con cualquier instrucción que no devuelva filas, como una declaración IF').
Solo haz esto:
SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT
donde p1 es el parámetro de salida que estableció en el procedimiento almacenado. Espero que ayude.
En su ejemplo, @@ ROWCOUNT
debería funcionar: es una forma adecuada de averiguar un número de filas eliminadas. Si está intentando eliminar algo de su aplicación, deberá utilizar SET NOCOUNT ON
Según la función MSDN @@ ROWCOUNT se actualiza incluso cuando SET NOCOUNT está ENCENDIDO, ya que SET NOCOUNT
solo afecta el mensaje que recibe después de la ejecución.
Entonces, si está intentando trabajar con los resultados de @@ ROWCOUNT
de, por ejemplo, ADO.NET, entonces SET NOCOUNT ON
definitivamente debería ayudar.
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, 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 eliminado
antes del nombre de campo datefield
.
Por curiosidad, ¿cómo llamas al procedimiento? (¿Supongo 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 el resultado de un conjunto de filas, que en este caso sería una sola fila con una sola columna. En ADO.Net, se podría acceder al primero mediante un parámetro y al último con un SqlDataReader. ¿Está, quizás, confundiendo el valor de retorno del procedimiento con el recuento de filas?
Crea una tabla temporal con una columna, id.
Insertar en la tabla temporal seleccionando los identificadores que desea eliminar. Eso te da tu cuenta.
Elimine de su tabla donde está id (seleccione id en la tabla temporal)