THIẾT LẬP NOCOUNT Lỗi khi xử lý cuộc gọi SQL sau khi nâng cấp


13

Chúng tôi đang nâng cấp môi trường thử nghiệm của mình với một máy chủ mới và phiên bản cập nhật của Microsoft SQL Server và đã gặp sự cố.

Trên máy chủ mới, mã cũ của chúng tôi sẽ nhận được "hoạt động không được phép khi đối tượng bị đóng" khi thực hiện một số thủ tục được lưu trữ. Thông báo này không bao giờ xuất hiện trên máy chủ cũ. Khi chúng tôi theo dõi nó, vấn đề có thể được giải quyết bằng cách thêm SET NOCOUNT ON;vào thủ tục được lưu trữ.

Tôi đã xem xét các mặc định trên cơ sở dữ liệu và thấy không có cài đặt nào khác (SQL Server 2008 so với SQL Server 2014) liên quan đến các mặc định.

Tôi nên xem xét cài đặt nào để giải quyết vấn đề này trên toàn cầu mà không cần thêm SET NOCOUNT ONvào một nghìn procs được lưu trữ?


2
Tất cả các thủ tục được lưu trữ phải chỉ định hành vi bạn dựa vào, an toàn hơn nhiều so với dựa vào tùy chọn người dùng. Tôi thậm chí có khả năng lập luận rằng mọi thủ tục được lưu trữ phải luôn luôn bắt đầu bằng SET NOCOUNT ON;, luôn luôn.
Aaron Bertrand

@AaronBertrand Tôi đồng ý; dự án cuối cùng tôi tham gia đã có một mẫu đã được thiết lập về đêm, nhưng đó không phải là một lựa chọn trong dự án này vào lúc này
UnhandledEx805Sean

Lưu ý rằng bạn có thể viết một tập lệnh để thay đổi tất cả các thủ tục được lưu trữ và chắp thêm SET NOCOUNT ON;vào lúc bắt đầu thủ tục được lưu trữ (sau BEGIN). Số lượng các thủ tục được lưu trữ không thực sự là một vấn đề.
Erik A

1
@ Erik-A - bạn không thể chắc chắn một quy trình được lưu trữ bắt đầu bằng BEGIN- thật hay, nhưng không bắt buộc.
Max Vernon

Câu trả lời:


16

Cấu hình máy chủ SQL có một tùy chọn được gọi một cách thích hợp, user optionscó thể được đặt bằng sp_configurethủ tục lưu trữ hệ thống. Tôi đã viết một bài đăng trên blog về SQL Server Science chỉ ra cách kiểm tra và thiết lập các tùy chọn người dùng.

Tóm lại, bạn có thể lấy "giá trị cấu hình" từ máy chủ cũ, bằng cách sử dụng:

EXEC sys.sp_configure 'user options';

Sau đó, đặt máy chủ mới để sử dụng các tùy chọn tương tự thông qua điều này:

EXEC sys.sp_configure 'user options', <config value>;
RECONFIGURE

(thay thế <config value> bằng giá trị từ máy chủ cũ).


Đó gần như chắc chắn là nguyên nhân (chờ xác nhận ngay bây giờ). Máy chủ cũ có giá trị 512 là NOCOUNT theo MS ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/ .) Tôi đã không nhìn thấy điều này sớm hơn khi tôi chỉ nhìn vào @@ TÙY CHỌN
UnhandledEx805Sean

Điều đó hoàn toàn chính xác. Nếu SET NOCOUNT ONgiải quyết được vấn đề, đặt tùy chọn người dùng thành 512 sẽ khắc phục sự cố.
Max Vernon
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.