SET NOCOUNT ข้อผิดพลาดในการจัดการการโทร SQL หลังจากอัพเกรด


13

เรากำลังอัพเกรดสภาพแวดล้อมการทดสอบของเราด้วยเซิร์ฟเวอร์ใหม่และ Microsoft SQL Server รุ่นที่ปรับปรุงแล้วและพบปัญหา

บนเซิร์ฟเวอร์ใหม่รหัสเก่าของเราจะได้รับ "การดำเนินการไม่ได้รับอนุญาตเมื่อวัตถุถูกปิด" เมื่อดำเนินการขั้นตอนการจัดเก็บบางอย่าง ข้อความนี้ไม่เคยปรากฏบนเซิร์ฟเวอร์เก่า เมื่อเราติดตามมันปัญหาสามารถแก้ไขได้โดยการเพิ่มSET NOCOUNT ON;ขั้นตอนการจัดเก็บ

ฉันดูค่าเริ่มต้นในฐานข้อมูลและไม่เห็นการตั้งค่าที่แตกต่าง (SQL Server 2008 เทียบกับ SQL Server 2014) ที่เกี่ยวข้องกับค่าเริ่มต้น

ฉันควรตั้งค่าแบบใดเพื่อแก้ไขปัญหานี้ทั่วโลกโดยไม่จำเป็นต้องเพิ่มSET NOCOUNT ONโปรแกรมที่เก็บไว้เป็นพันรายการ


2
โพรซีเดอร์ที่เก็บไว้ทั้งหมดควรระบุพฤติกรรมที่คุณวางใจซึ่งปลอดภัยกว่าการพึ่งพาตัวเลือกผู้ใช้ ฉันอาจจะยืนยันว่าทุกขั้นตอนการจัดเก็บควรเริ่มต้นด้วยSET NOCOUNT ON;เสมอ
Aaron Bertrand

@AaronBertrand ฉันเห็นด้วย; โครงการสุดท้ายที่ฉันใช้มีเทมเพลตที่ตั้งค่า nocount ไว้ แต่นั่นไม่ใช่ตัวเลือกในโครงการนี้ในเวลานี้
UnhandledExcepSean

โปรดทราบว่าคุณสามารถเขียนสคริปต์เพื่อแก้ไขขั้นตอนการจัดเก็บทั้งหมดและผนวกSET NOCOUNT ON;ที่จุดเริ่มต้นของขั้นตอนการจัดเก็บ (หลังจากBEGIN) จำนวนขั้นตอนการจัดเก็บไม่ควรเป็นปัญหาจริงๆ
เอริค

1
@ Erik-A - คุณไม่สามารถมั่นใจได้ว่าขั้นตอนการจัดเก็บเริ่มต้นด้วยBEGIN- มันดี แต่ไม่จำเป็น
Max Vernon

คำตอบ:


16

การกำหนดค่าเซิร์ฟเวอร์ SQL มีตัวเลือกที่เรียกว่าเหมาะสมuser optionsซึ่งสามารถตั้งค่าได้โดยใช้sp_configureกระบวนงานที่เก็บไว้ในระบบ ฉันเขียนโพสต์บล็อกในSQL Server Scienceซึ่งแสดงวิธีตรวจสอบและตั้งค่าตัวเลือกผู้ใช้

กล่าวโดยย่อคุณสามารถรับ "ค่าการกำหนดค่า" จากเซิร์ฟเวอร์เก่าโดยใช้สิ่งนี้:

EXEC sys.sp_configure 'user options';

จากนั้นตั้งค่าเซิร์ฟเวอร์ใหม่เพื่อใช้ตัวเลือกเดียวกันผ่านทางนี้:

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

(แทนที่ <config value> ด้วยค่าจากเซิร์ฟเวอร์เก่า)


นั่นคือสาเหตุที่แท้จริง (รอการยืนยันในตอนนี้) เซิร์ฟเวอร์เก่ามีค่า 512 ซึ่งเป็น NOCOUNT ตาม MS ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ) ฉันไม่เห็นสิ่งนี้ก่อนหน้านี้เมื่อฉันดูเฉพาะ @@ OPTIONS
UnhandledExcepSean

ถูกต้องแน่นอน หากSET NOCOUNT ONแก้ปัญหาได้การตั้งค่าตัวเลือกผู้ใช้เป็น 512 จะแก้ไขได้
Max Vernon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.