Làm cách nào để lấy số lượng bản ghi bị ảnh hưởng bởi một quy trình được lưu trữ?


86

Cho INSERT, UPDATEDELETEcâu lệnh SQL được thực hiện trực tiếp chống lại các cơ sở dữ liệu, hầu hết các nhà cung cấp cơ sở dữ liệu trả lại số hàng bị ảnh hưởng. Đối với các thủ tục được lưu trữ, số lượng bản ghi bị ảnh hưởng luôn luôn -1.

Làm thế nào để chúng tôi có được số lượng bản ghi bị ảnh hưởng bởi một thủ tục được lưu trữ?


1
Đặt Không đếm cũng là vấn đề của tôi. Để kiểm tra, hãy thực hiện quy trình được lưu trữ của bạn trong phòng thu quản lý và xem liệu bạn có nhận được số lượng hay không, nếu có, thì hãy đảm bảo rằng bạn có một biến thể đầu ra.
dùng2624356

Câu trả lời:


80

Đăng ký tham số out cho thủ tục được lưu trữ và đặt giá trị dựa trên @@ROWCOUNTnếu sử dụng SQL Server. Sử dụng SQL%ROWCOUNTnếu bạn đang sử dụng Oracle.

Lưu ý rằng nếu bạn có nhiều INSERT/UPDATE/DELETE, bạn sẽ cần một biến để lưu trữ kết quả @@ROWCOUNTcho mỗi thao tác.


46

@@RowCount sẽ cung cấp cho bạn số lượng bản ghi bị ảnh hưởng bởi Câu lệnh SQL.

Chỉ @@RowCounthoạt động nếu bạn phát hành nó ngay sau đó. Vì vậy, nếu bạn đang mắc lỗi, bạn phải làm điều đó trên cùng một dòng. Nếu bạn chia nhỏ nó ra, bạn sẽ bỏ lỡ phần nào bạn đặt thứ hai.

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

Nếu bạn có nhiều câu lệnh, bạn sẽ phải nắm bắt số lượng hàng bị ảnh hưởng cho mỗi câu lệnh và cộng chúng lại.

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

33

Đối với tôi, hóa ra SET NOCOUNT ONđã được đặt trong tập lệnh thủ tục được lưu trữ (theo mặc định trên SQL Server Management Studio) và SqlCommand.ExecuteNonQuery();luôn trả về -1.

Tôi chỉ cần thiết lập nó: SET NOCOUNT OFFmà không cần sử dụng @@ROWCOUNT.

Tìm thấy thêm chi tiết tại đây: SqlCommand.ExecuteNonQuery () trả về -1 khi thực hiện Chèn / Cập nhật / Xóa


Điều này làm việc cho tôi. Proc được lưu trữ của tôi chỉ là một câu lệnh chèn đơn giản và có vẻ như nó đang hoạt động. cảm ơn!
Harvey Darvey

Cảm ơn! Làm tốt công việc tham khảo.
Leo Gurdian

8

Đối với Microsoft SQL Server, bạn có thể trả về @@ROWCOUNTbiến để trả về số hàng bị ảnh hưởng bởi câu lệnh cuối cùng trong thủ tục được lưu trữ.



-2

CẢNH BÁO: @@ROWCOUNTcó thể trả về dữ liệu không có thật nếu bảng bị thay đổi có các trình kích hoạt được gắn vào nó!

Các @@ROWCOUNTsẽ trở lại với số lượng hồ sơ bị ảnh hưởng bởi TRIGGER, không báo cáo kết quả thực tế!


8
Hóa ra điều này không đúng: stackoverflow.com/questions/7005225/…
Tao
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.