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?

dthrasher
fonte
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.

Pôneis OMG
fonte
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
Raj More
fonte
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

Cara pascalou
fonte
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.

Bob Mc
fonte
-2

AVISO: @@ROWCOUNTpode retornar dados falsos se a tabela que está sendo alterada tiver gatilhos anexados a ela!

O @@ROWCOUNTretornará o número de registros afetados pelo TRIGGER, não a instrução real!

Michael Kingsford Gray
fonte
8
Acontece que isso não é verdade: stackoverflow.com/questions/7005225/…
Tao