Como posso obter o número de registros afetados por um procedimento armazenado?
-
05-07-2019 - |
Pergunta
Para INSERT
, UPDATE
e SQL DELETE
instruções executadas diretamente no banco de dados, a maioria dos provedores de banco de dados retornar a contagem de linhas afetadas. Para procedimentos armazenados, o número de registros afetados é sempre -1
.
Como podemos obter o número de registros afetados por um procedimento armazenado?
Solução
Registrar um parâmetro de saída para o procedimento armazenado, e defina o valor com base em @@ROWCOUNT
se estiver usando SQL Server. Use SQL%ROWCOUNT
se você estiver usando Oracle.
mente que se você tiver vários INSERT/UPDATE/DELETE
, você vai precisar de uma variável para armazenar o resultado de @@ROWCOUNT
para cada operação.
Outras dicas
@@RowCount
lhe dará o número de registros afetados por uma instrução SQL.
O @@RowCount
só funciona se você emiti-lo imediatamente depois. Então se você está prendendo erros, você tem que fazê-lo na mesma linha. Se você dividi-lo, você vai perder qualquer um que você colocou segundo.
SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
Se você tem várias instruções, você terá que capturar o número de linhas afetadas para cada um e adicioná-los para cima.
SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR
Acontece que para mim que SET NOCOUNT ON
foi definido no script de procedimento armazenado (por padrão no SQL Server Management Studio) e SqlCommand.ExecuteNonQuery();
sempre voltava -1.
Eu só defini-lo fora:. SET NOCOUNT OFF
sem a necessidade de uso @@ROWCOUNT
Mais detalhes encontrada aqui: SqlCommand.ExecuteNonQuery () retorna -1 quando fazer Insert / Update / Delete
Para o Microsoft SQL Server pode retornar a variável @@ROWCOUNT
para retornar o número de linhas afetadas pela última instrução no procedimento armazenado.
AVISO: @@ROWCOUNT
pode retornar falso de dados se a tabela sendo alterada tem gatilhos ligado a ele
O @@ROWCOUNT
irá retornar o número de registros afetados pelo gatilho, não a declaração real!