Para INSERT
, UPDATE
e DELETE
instruções SQL 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 obtemos o número de registros afetados por um procedimento armazenado?
Respostas:
Registre um parâmetro de saída para o procedimento armazenado e defina o valor com base no
@@ROWCOUNT
uso do SQL Server. UseSQL%ROWCOUNT
se você estiver usando Oracle.Lembre-se de que, se você tiver vários
INSERT/UPDATE/DELETE
, precisará de uma variável para armazenar o resultado de@@ROWCOUNT
cada operação.fonte
@@RowCount
fornecerá o número de registros afetados por uma instrução SQL.O
@@RowCount
funciona apenas se você emiti-lo imediatamente depois. Portanto, se você estiver capturando erros, deverá fazê-lo na mesma linha. Se você dividir, você perderá aquele que colocar em segundo lugar.SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
Se você tiver várias instruções, terá que capturar o número de linhas afetadas para cada uma e somá-las.
SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR
fonte
Acontece que para mim que
SET NOCOUNT ON
foi definido no script de procedimento armazenado (por padrão no SQL Server Management Studio) eSqlCommand.ExecuteNonQuery();
sempre retornou -1.Acabei de disparar:
SET NOCOUNT OFF
sem precisar usar@@ROWCOUNT
.Mais detalhes encontrados aqui: SqlCommand.ExecuteNonQuery () retorna -1 ao fazer Inserir / Atualizar / Excluir
fonte
Para o Microsoft SQL Server, você pode retornar a
@@ROWCOUNT
variável para retornar o número de linhas afetadas pela última instrução no procedimento armazenado.fonte
@@CONTAGEM DE LINHAS
fonte
AVISO:
@@ROWCOUNT
pode retornar dados falsos se a tabela que está sendo alterada tiver gatilhos anexados a ela!O
@@ROWCOUNT
retornará o número de registros afetados pelo TRIGGER, não a instrução real!fonte