Contando o número de linhas excluídas em um procedimento SQL Server armazenados
-
05-07-2019 - |
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?
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)