Saya memiliki program c # klien yang menjalankan prosedur tersimpan melalui ExectueNonQuery
, termasuk menangkap PRINT
output dan Kesalahan dengan peristiwa InfoMessage. Ini berfungsi dengan baik, tapi saya perhatikan ada yang aneh.
Ketika saya menjalankan prosedur tersimpan dari SSMS, ini menampilkan rowcounts untuk setiap pernyataan SQL individu yang dieksekusi di tab Pesan (seolah-olah itu berasal dari InfoMessages). Namun program saya tidak pernah melihat pesan-pesan ini, meskipun ia menangkap semua output lain yang sama. Sebaliknya, itu hanya mengembalikan baris yang terpengaruh dalam hasil fungsi ExecuteNonQuery yang merupakan jumlah dari semua jumlah baris individu (yang agak tidak berguna).
Sebagai contoh, prosedur ini:
use [tempdb]
go
SELECT *
INTO MyCols
FROM sys.columns
go
CREATE PROC foo As
UPDATE MyCols
SET name = name + N''
-- SSMS shows (662 row(s) affected)
UPDATE MyCols
SET name = name + N''
WHERE name like '%x%'
-- SSMS shows (59 row(s) affected)
PRINT 'bar'
-- both SSMS and ExecuteNonQuery get this
-- ExecuteNonQuery returns 721 rows affected
GO
Ketika foo
proc dijalankan, SSMS menampilkan jumlah baris dari 662 dan 59, tetapi ExecuteNonQuery
hanya mengembalikan total 721.
Jadi, bagaimana saya bisa mendapatkan informasi yang sama dengan SSMS?
Hanya untuk menjadi jelas di sini: Saya tidak tertarik dengan cara mengubah prosedur tersimpan untuk menambahkan PRINT @@ROWCOUNT
setelah setiap pernyataan SQL. Saya tahu bagaimana melakukan itu dan itu bukan pilihan sebagian besar waktu karena berbagai alasan.
Saya bertanya bagaimana melakukan apa yang dilakukan SSMS di sini. Saya dapat mengubah kode klien semua yang saya inginkan pada saat ini (untuk saat ini, toh) dan saya ingin melakukannya dengan benar.
sumber
PRINT
danRAISERROR(..., 10, 1)
pesan semua datang setelah set hasil. Saya mencoba menemukan pesan yang dipesan dalam dokumentasi itu, tetapi sejauh ini belum menemukannya.Hasil eksekusi permintaan tidak akan melakukan apa yang Anda inginkan di sini. Tetapi Anda masih bisa sampai di sana, itu hanya tergantung pada apa Anda ingin menggunakan informasi.
Anda dapat menambahkan baris ini setelah setiap sisipan "PRINT @@ ROWCOUNT" dan Anda harus mendapatkan jumlah baris yang dipengaruhi oleh operasi sebelumnya sebagai bagian dari output (di mana Anda mendapatkan "bar".
Atau, Anda dapat menambahkan parameter "OUTPUT" ke prosedur tersimpan Anda untuk menyimpan hasil dan kemudian hanya menangkap itu ketika Anda menjalankan file eksekusi.
EDIT:
Saya berhasil memodifikasi sampel yang Jonathan Kehasias kumpulkan untuk menyertakan penanganan acara yang dilengkapi pernyataan. Tambahkan saja dua baris ini.
sumber