procedimiento parametros filas fecha example ejemplos ejemplo ejecutar devolver datos condicion con almacenado afectadas sql-server tsql audit sql-delete

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 .