Pergunta

No SQL Server 2005, há uma maneira de excluir linhas e sendo dito quantos foram realmente eliminada?

Eu poderia fazer uma select count(*) com as mesmas condições, mas eu preciso que isso seja totalmente confiável.

Minha primeira suposição era usar as variáveis ??@@ROWCOUNT - mas isso não está definido, por exemplo,

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

select @@ROWCOUNT 

sempre retorna um 0.

MSDN sugere o OUTPUT construção, por exemplo

delete from mytable 
where datefield = '5-Oct-2008' 
output datefield into #doomed

select count(*) 
from #doomed

isso realmente falha com um erro de sintaxe.

Todas as idéias?

Foi útil?

Solução

Você já tentou SET NOCOUNT OFF?

Outras dicas

Eu uso @@ ROWCOUNT para esta finalidade exata em SQL2000 sem problemas. Certifique-se de que você não está inadvertidamente redefinir essa contagem antes de verificar-lo embora (BOL: 'Essa variável é definida como 0 por qualquer declaração que não retorna linhas, como uma instrução IF').

Apenas faça o seguinte:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

P1 é a saída do parâmetro definido no procedimento armazenado. Espero que ajude.

No seu exemplo @@ROWCOUNT deve funcionar - é um bom caminho para encontrar um número de linhas excluídas. Se você está tentando excluir algo de sua aplicação, então você vai precisar usar SET NOCOUNT ON

De acordo com a MSDN @@ ROWCOUNT função é atualizado mesmo quando SET NOCOUNT ON como SET NOCOUNT só afeta a mensagem que você recebe após a execução.

Então, se você está tentando trabalhar com os resultados de @@ROWCOUNT de, por exemplo, ADO.NET então SET NOCOUNT ON deve definitivamente ajuda.

Eu encontrei um caso em que você não pode usar @@rowcount, como quando você quer saber a contagem distinta dos valores que foram excluídos em vez da contagem total. Neste caso, você teria que fazer o seguinte:

delete from mytable 
where datefield = '5-Oct-2008' 
output deleted.datefield into #doomed

select count(distinct datefield)
from #doomed

O erro de sintaxe no OP foi porque output não incluem deleted antes do nome do campo datefield.

A título de curiosidade, como você está chamando o procedimento? (Estou assumindo que é um procedimento armazenado?). A razão que eu peço é que há uma diferença entre o valor de retorno de um procedimento armazenado (o que seria 0, neste caso), e um resultado conjunto de linhas - que neste caso seria uma única linha com uma única coluna. No ADO.Net, o ex-iria ser acessado por um parâmetro e este último com um SqlDataReader. É você, talvez, confundindo valor de retorno do procedimento que o número de linhas?

Criar tabela temporária com uma coluna, id.

Inserir na tabela temporária selecionando os ids que você deseja excluir. Isso dá-lhe a sua contagem.

Excluir da sua tabela onde id in (SELECT id da tabela temp)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top