2009-06-15 21 views
16

Tôi đang tạo một thủ tục lưu sẵn trong cơ sở dữ liệu Sql Server 2008. Tôi muốn trả lại số hàng bị ảnh hưởng. Lựa chọn nào tốt hơn SET NOCOUNT OFF hoặc RETURN @@ ROWCOUNT?SET NOCOUNT OFF hoặc RETURN @@ ROWCOUNT?

ALTER PROCEDURE [dbo].[MembersActivateAccount] 
    @MemberId uniqueidentifier 
AS 
BEGIN 
    -- Should I use this? 
    SET NOCOUNT OFF; 

    UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId; 
    --Or should I SET NOCOUNT ON and use the following line instead? 
    --return @@ROWCOUNT; 
END 

Tôi biết rằng cả hai đều hoạt động, nhưng đó là lựa chọn tốt hơn và tại sao?


Sau khi thử một số, tôi đi đến kết luận SET NOCOUNT được TẮT theo mặc định trong các thủ tục được lưu trữ. Có thể thay đổi hành vi này bên trong cơ sở dữ liệu của tôi không?

Trả lời

23

Sử dụng @@ RowCount. Rõ ràng và minh bạch, nó hoàn toàn được kiểm soát bởi mã của bạn chứ không phải là hành vi được tích hợp sẵn.

Tùy chọn NOCOUNT có thể được đặt theo cách thủ công thành mặc định thành ON (Optons> Truy vấn thực thi> SQL Server> Nâng cao). Nếu bạn đặt nó theo cách này nhưng sau đó khai báo SET NOCOUNT OFF trong thủ tục được lưu trữ của bạn thì cài đặt cục bộ sẽ được ưu tiên.

4

Tôi biết rằng có SET NOCOUNT ON sẽ làm cho một DataAdapter nghĩ rằng có một xung đột đồng thời.

Bạn có thể read about it on MSDN. Nếu mã sẽ được sử dụng bởi DataAdapters thì rõ ràng là không sử dụng SET NOCOUNT ON.

Dường như SqlCommand also has this behaviour, mà tôi đoán là lý do tại sao DataAdapter có vấn đề (như dưới mui xe, nó sẽ sử dụng một đối tượng Lệnh).

+0

Tôi không thấy bất cứ điều gì được đề cập về SET NOCOUNT bên trong tài liệu SqlCommand. Bạn có chắc rằng có cùng vấn đề với DataAdapters không? – niaher

+1

Google it- bạn sẽ tìm thấy nhiều bằng chứng cho thấy: http://www.google.co.uk/search?client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&channel=s&hl=vi&q=ExecuteNonQuery+ NoCount & meta = & btnG = Google + Tìm kiếm. Tôi không thể chắc chắn đó là cùng một vấn đề như DataAdapters mà không thử nghiệm nó, nhưng tôi không thấy lý do tại sao sẽ có một lý do khác. – RichardOD

5

Không sử dụng RETURN cho các giá trị. Theo quy ước RETURN từ các thủ tục lưu trữ là cho các mã lỗi, 0 có nghĩa là không có lỗi và không 0 có nghĩa là một số loại vấn đề. Nếu bạn cần dữ liệu trở lại, cách thích hợp để làm điều đó là với tham số OUTPUT. Đó là một chút phản trực giác dựa trên việc sử dụng trở lại của các ngôn ngữ khác.

+0

Có lý do cho việc này: Lần cuối cùng tôi đã chọn, RETURN được giới hạn ở các giá trị rút gọn, nghĩa là giá trị trả lại tối đa là 65535. – enorl76

2

Lý do cho việc sử dụng SET NOCOUNT ON/OFF:

Để kiểm soát stack overflow khi chèn hàng vào bất kỳ bảng. Truyền các thông điệp T-Sql trong khi thực hiện các truy vấn hoặc truy vấn lồng nhau. Để hiển thị hoặc xem các truy vấn mới nhất được thực hiện. Để nhận thông tin về sự gia tăng kỷ lục mới nhất.

0

Tại sao chúng ta sử dụng SET NOCOUNT on/off ---

Ans: chúng ta có thể hiểu được điều này bằng các bước sau đây

bước 1: thực hiện truy vấn "Chọn top 10 * từ tên bảng" .

bước 2: cửa sổ tin nhắn mở nó hiển thị thông báo "10 hàng bị ảnh hưởng". nó tạo thêm chi phí và kéo dài thời gian thực hiện của chúng tôi.

bước 3: để khắc phục chi phí bổ sung này, chúng tôi sử dụng SET NOCOUNT ON. Nếu nó là On thì nó sẽ không bao giờ đếm số lượng hàng trả về thay vì nó gieo một lệnh thông báo hoàn thành thành công.

Bước 4: Theo mặc định NOCOUNT là BẬT thì nó đếm số hàng trả về đó là lý do tại sao đề xuất của tôi nên tắt trong khi tạo quy trình mới để có hiệu suất tốt hơn từ máy chủ cơ sở dữ liệu.