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?

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top