Bagaimana saya bisa mendapatkan jumlah rekaman yang dipengaruhi oleh prosedur tersimpan?

86

Untuk INSERT, UPDATEdan DELETEpernyataan SQL dijalankan langsung terhadap database, sebagian besar penyedia database mengembalikan jumlah baris yang terpengaruh. Untuk prosedur yang tersimpan, jumlah record yang terpengaruh selalu -1.

Bagaimana kita mendapatkan jumlah rekaman yang dipengaruhi oleh prosedur tersimpan?

dthrasher.dll
sumber
1
Set No Count adalah masalah saya juga. Untuk mengujinya, jalankan prosedur tersimpan Anda di studio manajemen dan lihat apakah Anda mendapatkan hitungan, jika Anda melakukannya, pastikan Anda memiliki variabel keluaran.
pengguna2624356

Jawaban:

80

Daftarkan parameter keluar untuk prosedur tersimpan, dan setel nilai berdasarkan @@ROWCOUNTjika menggunakan SQL Server. MenggunakanSQL%ROWCOUNT jika Anda menggunakan Oracle.

Ingatlah bahwa jika Anda memiliki banyak INSERT/UPDATE/DELETE, Anda memerlukan variabel untuk menyimpan hasil dari @@ROWCOUNTsetiap operasi.

OMG Ponies
sumber
46

@@RowCount akan memberi Anda jumlah record yang dipengaruhi oleh Pernyataan SQL.

The @@RowCountbekerja hanya jika Anda mengeluarkan segera setelah itu. Jadi jika Anda menjebak kesalahan, Anda harus melakukannya di baris yang sama. Jika Anda membaginya, Anda akan kehilangan yang mana pun yang Anda tempatkan kedua.

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR

Jika Anda memiliki beberapa pernyataan, Anda harus menangkap jumlah baris yang terpengaruh untuk masing-masing pernyataan dan menjumlahkannya.

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR
Raj Lebih
sumber
33

Ternyata bagi saya yang SET NOCOUNT ONditetapkan dalam skrip prosedur tersimpan (secara default di SQL Server Management Studio) danSqlCommand.ExecuteNonQuery(); selalu dikembalikan -1.

Saya baru saja mematikannya: SET NOCOUNT OFFtanpa perlu menggunakan @@ROWCOUNT.

Detail lebih lanjut ditemukan di sini: SqlCommand.ExecuteNonQuery () mengembalikan -1 saat melakukan Sisipkan / Perbarui / Hapus

Bung Pascalou
sumber
Ini berhasil untuk saya. Proc saya yang disimpan hanyalah pernyataan penyisipan sederhana, dan tampaknya berfungsi. Terima kasih!
Harvey Darvey
Terima kasih! Kerja bagus di referensi.
Leo Gurdian
8

Untuk Microsoft SQL Server, Anda dapat mengembalikan @@ROWCOUNTvariabel untuk mengembalikan jumlah baris yang dipengaruhi oleh pernyataan terakhir dalam prosedur tersimpan.

Bob Mc
sumber
-2

PERINGATAN: @@ROWCOUNTdapat mengembalikan data palsu jika tabel yang diubah memiliki pemicu menyertainya!

The @@ROWCOUNTakan mengembalikan jumlah record dipengaruhi oleh TRIGGER, bukan pernyataan yang sebenarnya!

Michael Kingsford Grey
sumber
8
Ternyata ini tidak benar: stackoverflow.com/questions/7005225/…
Tao