Tôi có một chương trình c # máy khách đang thực hiện các thủ tục được lưu trữ thông qua ExectueNonQuery
, bao gồm cả việc bắt PRINT
đầu ra và Lỗi với các sự kiện InfoMessage. Nó hoạt động tốt, nhưng tôi đã nhận thấy một cái gì đó kỳ lạ.
Khi tôi thực hiện một thủ tục được lưu trữ từ SSMS, nó sẽ hiển thị số lượng hàng cho từng câu lệnh SQL riêng lẻ được thực thi trong tab Tin nhắn (như thể nó đến từ InfoMessages). Tuy nhiên, chương trình của tôi không bao giờ nhìn thấy những thông báo này, mặc dù nó không bắt được tất cả các đầu ra khác. Thay vào đó, nó chỉ trả về các hàng bị ảnh hưởng trong kết quả hàm ExecuteNonQuery là tổng của tất cả các hàng riêng lẻ (loại này là vô dụng).
Ví dụ: quy trình này:
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
Khi foo
Proc được chạy, SSMS hiển thị số lượng hàng là 662 và 59, nhưng ExecuteNonQuery
chỉ trả về tổng số 721.
Vậy, làm thế nào tôi có thể có được thông tin tương tự mà SSMS đang nhận được?
Chỉ cần rõ ràng ở đây: Tôi không quan tâm đến cách thay đổi các thủ tục được lưu trữ để thêm PRINT @@ROWCOUNT
s sau mỗi câu lệnh SQL. Tôi biết làm thế nào để làm điều đó và nó không phải là một lựa chọn hầu hết thời gian vì nhiều lý do.
Tôi đang hỏi làm thế nào để làm những gì SSMS đang làm ở đây. Tôi có thể thay đổi mã máy khách tất cả những gì tôi muốn tại thời điểm này (ngay bây giờ, dù sao đi nữa) và tôi muốn làm điều đó ngay.