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?

Foi útil?

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!

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