แรงบันดาลใจจากคำถามนี้ที่มีมุมมองที่แตกต่างกันใน SET NOCOUNT ...
เราควรใช้ SET NOCOUNT ON สำหรับ SQL Server หรือไม่ ถ้าไม่ทำไมล่ะ
การแก้ไข 6 ในวันที่ 22 กรกฎาคม 2011 คืออะไร
จะไม่แสดงข้อความ "แถว xx ที่ได้รับผลกระทบ" หลังจาก DML ใด ๆ นี่เป็นชุดผลลัพธ์และเมื่อส่งลูกค้าจะต้องดำเนินการ มันเล็ก แต่วัดได้ (ดูคำตอบด้านล่าง)
สำหรับทริกเกอร์ ฯลฯ ลูกค้าจะได้รับ "xx rows ที่ได้รับผลกระทบ" หลายครั้งและทำให้เกิดข้อผิดพลาดทุกรูปแบบสำหรับ ORMs บางตัว, MS Access, JPA และอื่น ๆ (ดูการแก้ไขด้านล่าง)
พื้นหลัง:
วิธีปฏิบัติที่ดีที่สุดที่เป็นที่ยอมรับทั่วไป (ฉันคิดว่าจนกระทั่งคำถามนี้) คือการใช้SET NOCOUNT ON
ในทริกเกอร์และขั้นตอนการจัดเก็บใน SQL Server เราใช้งานได้ทุกที่และ google ฉบับย่อก็แสดงให้เห็นว่ามี SQLPV Server จำนวนมากที่เห็นด้วยเช่นกัน
MSDN กล่าวนี้สามารถทำลาย.net SqlDataAdapter
ตอนนี้สิ่งนี้หมายความว่า SQLDataAdapter นั้นถูก จำกัด เพียงการประมวลผล CRUD อย่างเต็มที่เพราะมันคาดว่าข้อความ "n แถวที่ได้รับผลกระทบ" จะตรงกัน ดังนั้นฉันไม่สามารถใช้:
- หากมีอยู่เพื่อหลีกเลี่ยงการซ้ำซ้อน (ไม่มีข้อความที่ได้รับผลกระทบแถว) หมายเหตุ: ใช้ด้วยความระมัดระวัง
- ไม่อยู่ (แถวน้อยกว่าที่คาดไว้
- กรองการอัพเดทเล็กน้อย (เช่นไม่มีการเปลี่ยนแปลงข้อมูลจริง)
- ทำการเข้าถึงตารางใด ๆ ก่อน (เช่นการบันทึก)
- ซ่อนความซับซ้อนหรือ denormlisation
- ฯลฯ
ในคำถามที่ marc_s (ใครรู้เรื่อง SQL ของเขา) บอกว่าอย่าใช้มัน สิ่งนี้แตกต่างจากที่ฉันคิด (และฉันถือว่าตัวเองมีความสามารถพอสมควรที่ SQL เช่นกัน)
เป็นไปได้ว่าฉันขาดอะไรไปบ้าง (อย่าลังเลที่จะชี้ให้เห็นอย่างชัดเจน) แต่คุณคิดว่ายังไงบ้าง?
หมายเหตุ: เป็นเวลาหลายปีแล้วที่ฉันเห็นข้อผิดพลาดนี้เพราะฉันไม่ได้ใช้ SQLDataAdapter ทุกวันนี้
แก้ไขหลังจากความคิดเห็นและคำถาม:
แก้ไข: ความคิดเพิ่มเติม ...
เรามีหลายไคลเอนต์: หนึ่งอาจใช้ C # SQLDataAdaptor อื่นอาจใช้ nHibernate จาก Java SET NOCOUNT ON
เหล่านี้ได้รับผลกระทบในรูปแบบที่แตกต่างกันด้วย
ถ้าคุณคิดว่า procs ที่เก็บไว้เป็นวิธีการมันเป็นรูปแบบที่ไม่ดี (anti-pattern) เพื่อสมมติว่าการประมวลผลภายในบางอย่างทำงานในลักษณะที่เป็นไปตามวัตถุประสงค์ของคุณเอง
แก้ไข 2: ทริกเกอร์แบ่งคำถาม nHibernateซึ่งSET NOCOUNT ON
ไม่สามารถตั้งค่าได้
(และไม่มันไม่ซ้ำกันนี้ )
แก้ไข 3: ยังมีข้อมูลเพิ่มเติมขอบคุณเพื่อนร่วมงาน MVP ของฉัน
- KB 240882ปัญหาที่ทำให้เกิดการเชื่อมต่อกับ SQL 2000 และรุ่นก่อนหน้า
- ตัวอย่างของการเพิ่มประสิทธิภาพ
แก้ไข 4: 13 พฤษภาคม 2554
แบ่ง Linq 2 SQL ด้วยเมื่อไม่ได้ระบุ?
แก้ไข 5: 14 มิถุนายน 2554
แบ่ง JPA, proc ที่จัดเก็บพร้อมตัวแปรตาราง: JPA 2.0 รองรับตัวแปรตาราง SQL Server หรือไม่
แก้ไข 6: 15 สิงหาคม 2554
ตารางข้อมูล "แก้ไขแถว" SSMS ต้องการ SET NOCOUNT ON: อัพเดททริกเกอร์ด้วย GROUP BY
แก้ไข 7: 07 Mar 2013
รายละเอียดเชิงลึกเพิ่มเติมจาก @RemusRusanu: การ
เปิด SET NOCOUNT ทำให้เกิดความแตกต่างด้านประสิทธิภาพหรือไม่