parametros - Contando el número de filas eliminadas en un procedimiento almacenado de SQL Server
procedimiento almacenado sql server ejemplo (7)
En SQL Server 2005, ¿hay alguna manera de eliminar filas y saber cuántas se borraron 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á configurado, por ejemplo
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.
¿Algunas ideas?
Crear tabla temporal con una columna, id.
Insertar en la tabla temporal seleccionando los ID que desea eliminar. Eso te da tu cuenta.
Eliminar de su tabla donde está el id (seleccionar id de la tabla de temp)
En su ejemplo, @@ROWCOUNT
debería funcionar: es una forma adecuada de averiguar una cantidad de filas eliminadas. Si intentas eliminar algo de tu aplicación, deberás usar SET NOCOUNT ON
De acuerdo con MSDN @@ ROWCOUNT la función se actualiza incluso cuando SET NOCOUNT está activado ya que SET NOCOUNT
solo afecta el mensaje que recibe después de la ejecución.
Por lo tanto, si intenta trabajar con los resultados de @@ROWCOUNT
de, por ejemplo, ADO.NET, SET NOCOUNT ON
definitivamente debería ayudar.
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'').
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?
Solo haz esto:
SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT
donde p1 es el parámetro de salida que configura en el procedimiento almacenado. Espero eso ayude.
¿Has probado SET NOCOUNT OFF
?
Encontré un caso donde 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ías 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 el output
no incluía la datefield
antes del nombre del campo del campo de la datefield
.