Como posso obter o número de registros afetados por um procedimento armazenado?


86

Para INSERT, UPDATEe DELETEinstruçõ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?


1
Definir sem contagem também era meu problema. Para testar, execute seu procedimento armazenado no estúdio de gerenciamento e veja se consegue contagens, se conseguir, certifique-se de ter uma variável de saída.
user2624356

Respostas:


80

Registre um parâmetro de saída para o procedimento armazenado e defina o valor com base no @@ROWCOUNTuso do SQL Server. Use SQL%ROWCOUNTse 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 @@ROWCOUNTcada operação.


46

@@RowCount fornecerá o número de registros afetados por uma instrução SQL.

O @@RowCountfunciona 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

33

Acontece que para mim que SET NOCOUNT ONfoi definido no script de procedimento armazenado (por padrão no SQL Server Management Studio) e SqlCommand.ExecuteNonQuery();sempre retornou -1.

Acabei de disparar: SET NOCOUNT OFFsem precisar usar @@ROWCOUNT.

Mais detalhes encontrados aqui: SqlCommand.ExecuteNonQuery () retorna -1 ao fazer Inserir / Atualizar / Excluir


Isso funciona para mim. Meu proc armazenado é apenas uma simples instrução de inserção e parece estar funcionando. obrigado!
Harvey Darvey

Obrigado! Bom trabalho na referência.
Leo Gurdian

8

Para o Microsoft SQL Server, você pode retornar a @@ROWCOUNTvariável para retornar o número de linhas afetadas pela última instrução no procedimento armazenado.



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.