SET NOCOUNT Kesalahan dalam menangani panggilan SQL setelah peningkatan

13

Kami meningkatkan lingkungan pengujian kami dengan server baru dan versi terbaru dari Microsoft SQL Server dan telah mengalami masalah.

Di server baru, kode lama kami akan mendapatkan "operasi tidak diizinkan ketika objek ditutup" ketika menjalankan beberapa prosedur yang tersimpan. Pesan ini tidak pernah muncul di server lama. Ketika kami melacaknya, masalah dapat diatasi dengan menambahkan SET NOCOUNT ON;ke prosedur tersimpan.

Saya melihat default pada database dan tidak melihat pengaturan yang berbeda (SQL Server 2008 vs SQL Server 2014) yang terkait dengan default.

Pengaturan apa yang harus saya cari untuk menyelesaikan masalah ini secara global tanpa perlu menambah SET NOCOUNT ONribuan procs yang disimpan?

UnhandledExcepSean
sumber
2
Semua prosedur tersimpan harus menentukan perilaku yang Anda andalkan, yang jauh lebih aman daripada mengandalkan opsi pengguna. Saya bahkan berpotensi berpendapat bahwa setiap prosedur tersimpan harus selalu dimulai dengan SET NOCOUNT ON;, selalu.
Aaron Bertrand
@ AaronBertrand Saya setuju; proyek terakhir yang saya tempati memiliki templat yang telah menetapkan nocount aktif, tetapi itu bukan pilihan dalam proyek ini saat ini
UnhandledExcepSean
Perhatikan bahwa Anda dapat menulis skrip untuk mengubah semua prosedur tersimpan dan menambahkannya SET NOCOUNT ON;pada awal prosedur tersimpan (setelah BEGIN). Jumlah prosedur tersimpan seharusnya tidak menjadi masalah.
Erik A
1
@ Erik-A - Anda tidak dapat memastikan prosedur tersimpan dimulai dengan BEGIN- bagus, tetapi tidak diperlukan.
Max Vernon

Jawaban:

16

Konfigurasi SQL Server memiliki opsi yang disebut, tepat user options,, yang dapat diatur menggunakan sp_configureprosedur yang tersimpan sistem. Saya menulis posting blog tentang SQL Server Science yang menunjukkan cara memeriksa dan mengatur opsi pengguna.

Secara singkat, Anda bisa mendapatkan "nilai konfigurasi" dari server lama, menggunakan ini:

EXEC sys.sp_configure 'user options';

Kemudian, atur server baru untuk menggunakan opsi yang sama melalui ini:

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

(ganti <nilai konfigurasi> dengan nilai dari server lama).

Max Vernon
sumber
Itu hampir pasti penyebabnya (menunggu konfirmasi sekarang). Server lama memiliki nilai 512 yang NOCOUNT menurut MS ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). Saya tidak melihat ini sebelumnya karena saya hanya melihat @@ PILIHAN
UnhandledExcepSean
Itu benar sekali. Jika SET NOCOUNT ONmemecahkan masalah, mengatur opsi pengguna ke 512 akan memperbaikinya.
Max Vernon