Lấy cảm hứng từ câu hỏi này , nơi có các quan điểm khác nhau về SET NOCOUNT ...
Chúng ta có nên sử dụng SET NOCOUNT ON cho SQL Server không? Nếu không, tai sao không?
Nó làm gì Chỉnh sửa 6, vào ngày 22 tháng 7 năm 2011
Nó chặn thông báo "xx hàng bị ảnh hưởng" sau bất kỳ DML nào. Đây là một tập kết quả và khi được gửi, khách hàng phải xử lý nó. Nó nhỏ, nhưng có thể đo lường được (xem câu trả lời bên dưới)
Đối với các kích hoạt, v.v., khách hàng sẽ nhận được nhiều "hàng xx bị ảnh hưởng" và điều này gây ra tất cả các lỗi cho một số ORM, MS Access, JPA, v.v. (xem các chỉnh sửa bên dưới)
Lý lịch:
Thực tiễn tốt nhất được chấp nhận chung (tôi nghĩ cho đến khi câu hỏi này) là sử dụng SET NOCOUNT ON
trong các trình kích hoạt và các thủ tục được lưu trữ trong SQL Server. Chúng tôi sử dụng nó ở mọi nơi và google nhanh chóng cho thấy rất nhiều MVP của SQL Server cũng đồng ý.
MSDN cho biết điều này có thể phá vỡ một SQLDataAd CHƯƠNG .net .
Bây giờ, điều này có nghĩa với tôi rằng SQLDataAd CHƯƠNG bị giới hạn trong việc xử lý CRUD hoàn toàn đơn giản vì nó hy vọng thông điệp "n hàng bị ảnh hưởng" khớp. Vì vậy, tôi không thể sử dụng:
- NẾU EXISTS để tránh trùng lặp (không có thông báo ảnh hưởng đến hàng) Lưu ý: sử dụng thận trọng
- Ở ĐÂU KHÔNG EXISTS (ít hàng hơn dự kiến
- Lọc ra các cập nhật nhỏ (ví dụ: không có dữ liệu thực sự thay đổi)
- Thực hiện bất kỳ truy cập bảng trước (chẳng hạn như đăng nhập)
- Ẩn sự phức tạp hoặc biến dạng
- Vân vân
Trong câu hỏi marc_s (người biết công cụ SQL của anh ta) nói không sử dụng nó. Điều này khác với những gì tôi nghĩ (và tôi cũng tự coi mình là người có năng lực ở SQL).
Có thể tôi đang thiếu một cái gì đó (cứ thoải mái chỉ ra điều hiển nhiên), nhưng bạn nghĩ sao?
Lưu ý: đã nhiều năm kể từ khi tôi gặp lỗi này vì hiện tại tôi không sử dụng SQLDataAd CHƯƠNG.
Chỉnh sửa sau khi nhận xét và câu hỏi:
Chỉnh sửa: Thêm suy nghĩ ...
Chúng tôi có nhiều khách hàng: một người có thể sử dụng C # SQLDataAdaptor, một người khác có thể sử dụng nHibernate từ Java. Đây có thể bị ảnh hưởng theo những cách khác nhau với SET NOCOUNT ON
.
Nếu bạn coi các procs được lưu trữ như các phương thức, thì đó là hình thức xấu (chống mẫu) để cho rằng một số xử lý nội bộ hoạt động theo một cách nhất định cho mục đích riêng của bạn.
Chỉnh sửa 2: kích hoạt phá vỡ câu hỏi nHibernate , nơi SET NOCOUNT ON
không thể được đặt
(và không, nó không phải là một bản sao của điều này )
Chỉnh sửa 3: Thông tin thêm, nhờ đồng nghiệp MVP của tôi
- KB 240882 , sự cố gây mất kết nối trên SQL 2000 trở về trước
- Bản trình diễn tăng hiệu suất
Chỉnh sửa 4: 13 tháng 5 năm 2011
Phá vỡ Linq 2 SQL quá khi không được chỉ định?
Chỉnh sửa 5: 14 tháng 6 năm 2011
Phá vỡ JPA, Proc được lưu trữ với các biến bảng: JPA 2.0 có hỗ trợ các biến bảng SQL Server không?
Chỉnh sửa 6: 15 tháng 8 năm 2011
Lưới dữ liệu "Chỉnh sửa hàng" SSMS yêu cầu THIẾT LẬP NOCOUNT: Cập nhật kích hoạt với GROUP BY
Chỉnh sửa 7: 07/03/2013
Thông tin chi tiết chuyên sâu từ @RemusRusanu:
Liệu SET NOCOUNT ON có thực sự tạo ra sự khác biệt lớn về hiệu suất không