อาการ

เมื่อคุณใช้ฟังก์ชัน SCOPE_IDENTITY()หรือ @@IDENTITYเพื่อรับค่าที่แทรกลงในคอลัมน์ข้อมูลเฉพาะตัว คุณอาจสังเกตเห็นว่าในบางครั้งฟังก์ชันเหล่านี้จะส่งกลับค่าที่ไม่ถูกต้อง ปัญหาจะเกิดขึ้นเมื่อคิวรีของคุณใช้แผนปฏิบัติการแบบขนานเท่านั้น For more information on how to determine if your queries are going to use parallel execution plans refer to the Intra-query parallelism section in the following technical article on Microsoft Downloads:

สาเหตุ

Microsoft ได้ยืนยันว่าปัญหานี้เป็นปัญหาในผลิตภัณฑ์ของ Microsoft ที่แสดงอยู่ในตอนต้นของบทความนี้

การแก้ไข

ข้อมูลโปรแกรมอัปเดตสะสม

SQL Server 2008 R2 Service Pack 1

การแก้ไขของปัญหานี้ถูกปล่อยครั้งแรกในการอัปเดตสะสม 5 for SQL Server 2008 R2 Service Pack 1 For more information about how to obtain this cumulative update package, click the following article number to view the article in the Microsoft Knowledge Base: 

2659694แพคเกจการอัปเดตสะสม 5 ของ SQL Server 2008 R2 Service Pack 1

หมายเหตุ เนื่องจากบิลด์เป็นแบบสะสม การแก้ไขใหม่แต่ละรุ่นจะมีการแก้ไขด่วนทั้งหมดและการแก้ไขด้านความปลอดภัยทั้งหมดที่รวมอยู่ในรุ่นแก้ไขของ SQL Server 2008 R2 ก่อนหน้า เราขอแนะนนะให้คุณพิจารณาใช้การแก้ไขล่าสุดที่มีการแก้ไขด่วนนี้ สำหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base:

2567616รุ่น SQL Server 2008 R2 ที่เผยแพร่หลังจากเปิดตัว SQL Server 2008 R2 Service Pack 1 แล้ว

วิธีแก้ไขปัญหาชั่วคราว

Microsoft ขอแนะให้คุณไม่ใช้ฟังก์ชันใดฟังก์ชันหนึ่งในคิวรีของคุณเมื่อมีแผนคู่ขนานเนื่องจากแผนเหล่านี้ไม่น่าเชื่อถือเสมอไป ให้ใช้ส่วนสั่ง OUTPUT ของข้อความ INSERT เพื่อรับค่าข้อมูลเฉพาะตัวตามที่แสดงในตัวอย่างด้านล่างแทน

ตัวอย่างของการใช้ส่วนสั่ง OUTPUT:

DECLARED @MyNewIdentityValues table(myidvalues int) ประกาศ@A (ID คีย์หลัก) แทรก@A (1) ประกาศ@B (ID เป็นข้อมูลเฉพาะตัวของคีย์หลัก(1,1), B int not null) แทรก@B (1) เลือก     [RowCount] = @@RowCount,     [@@IDENTITY] = @@IDENTITY,     [SCOPE_IDENTITY] = SCOPE_IDENTITY() ตั้งค่าโปรไฟล์สถิติเมื่อ แทรก_ddr_T ผลลัพธ์ inserted.ID เป็น @MyNewIdentityValues     เลือก             b.ID         จาก @A a             การรวมด้านซ้าย@B b เมื่อวันที่ b.ID = 1             การรวมด้านซ้าย@B b2 บน b2 B = -1             การรวมด้านซ้าย_ddr_T t บน t.T = -1         เมื่อไม่มีอยู่ (เลือก * จาก _ddr_T t2 โดยที่ t2.ID = -1) ตั้งค่าโปรไฟล์สถิติปิดอยู่ เลือก     [RowCount] = @@RowCount,     [@@IDENTITY] = @@IDENTITY,     [SCOPE_IDENTITY] = SCOPE_IDENTITY(),     [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T') เลือก * จาก @MyNewIdentityValues ไป

ถ้าสถานการณ์ของคุณต้องการให้คุณใช้ฟังก์ชันใดฟังก์ชันหนึ่งเหล่านี้ คุณสามารถใช้หนึ่งในวิธีต่อไปนี้เพื่อแก้ไขปัญหาชั่วคราว

วิธีที่ 1:

รวมตัวเลือกต่อไปนี้ในคิวรีของคุณ

OPTION (MAXDOP 1)

หมายเหตุ: ซึ่งอาจเจ็บประสิทธิภาพการการคํานวณของส่วน SELECT ของคิวรีของคุณ

วิธีที่ 2:

อ่านค่าจากส่วน SELECT ลงในชุดของตัวแปร (หรือตัวแปรตารางเดียว) แล้วแทรกลงในตารางเป้าหมายด้วย MAXDOP=1 เนื่องจากแผน INSERT จะไม่ถูกขนานไปกับผลลัพธ์ที่ถูกต้อง แต่ SELECT ของคุณจะขนานไปกับประสิทธิภาพที่ต้องการ

วิธีที่ 3:

เรียกใช้ข้อความต่อไปนี้เพื่อตั้งค่าองศา สูงสุดของตัวเลือกแนวขนาน เป็น 1:

sp_configure 'องศาสูงสุดของแนวขนาน', 1

ไป

ตั้งค่าใหม่ด้วยการแทนที่

ไป

หมายเหตุ: วิธีนี้อาจทําให้ประสิทธิภาพการลดลงของเซิร์ฟเวอร์ คุณไม่ควรใช้วิธีการนี้นอกจากว่าคุณได้ประเมินวิธีการดังกล่าวในสภาพแวดล้อมการทดสอบหรือการจัดเตรียม

ข้อมูลเพิ่มเติม

ข้อบกพร่องของ Microsoft Connect เกี่ยวกับhttps://docs.microsoft.com/en-us/collaborate/connect-redirect

ระดับความขนานสูงสุด (MAXDOP)

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่

ต้องการตัวเลือกเพิ่มเติมหรือไม่

สํารวจสิทธิประโยชน์ของการสมัครใช้งาน เรียกดูหลักสูตรการฝึกอบรม เรียนรู้วิธีการรักษาความปลอดภัยอุปกรณ์ของคุณ และอื่นๆ