อาการ
บนคอมพิวเตอร์ที่ใช้ Microsoft SQL Server ๒๐๐๘ให้พิจารณาสถานการณ์สมมติต่อไปนี้
สถานการณ์ที่ 1
คุณระบุนิพจน์ทั่วไปของตาราง (CTE) โดยใช้คำสั่งที่มี ตัวอย่างเช่นคุณเรียกใช้แบบสอบถามต่อไปนี้
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
จากนั้นคุณเรียกใช้คิวรีนี้
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
ในสถานการณ์สมมตินี้แผนการสอบถามที่แคชไว้สำหรับแบบสอบถามนี้จะเก็บค่า statement_start_offset และค่า statement_end_offset ที่ไม่ถูกต้อง โดยเฉพาะคุณสังเกตเห็นค่า statement_end_offset มีขนาดเล็กกว่าค่า statement_start_offset เมื่อคุณเรียกใช้ sys.dm_exec_query_stats การจัดการแบบไดนามิก (DMV) เนื่องจากปัญหานี้รายงานประสิทธิภาพการทำงานอาจล้มเหลวเมื่อรายงานสันนิษฐานว่าค่า statement_start_offset จะมีขนาดเล็กกว่าค่า statement_stop_offset เสมอ
สถานการณ์ที่ 2
คุณระบุนิพจน์ตารางทั่วไปโดยใช้คำสั่งที่มีและคุณใช้ตัวเลือกการคอมไพล์ ตัวอย่างเช่นคุณสร้างฟังก์ชันใน SQL Server ๒๐๐๘โดยใช้สคริปต์ต่อไปนี้
CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND
เมื่อคุณเรียกใช้แบบสอบถาม "เลือก dbo function1 ()" คุณจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
เกิดข้อผิดพลาดร้ายแรงบนคำสั่งปัจจุบัน ผลลัพธ์ถ้ามีควรละทิ้ง
นอกจากนี้ข้อผิดพลาดนี้อาจเกิดขึ้นได้โดยไม่มีตัวเลือกการคอมไพล์ถ้า SQL server กำลังประสบกับการรับส่งข้อมูลบนเซิร์ฟเวอร์จำนวนมาก
สถานการณ์สมมติ3
คุณระบุนิพจน์ตารางทั่วไปโดยใช้คำสั่งที่มี ในคำสั่งที่มีคำสั่งที่คุณระบุตารางที่ไม่มีอยู่ ตัวอย่างเช่นคุณเรียกใช้แบบสอบถามต่อไปนี้
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
เมื่อคุณเรียกใช้แบบสอบถามนี้คุณจะไม่ได้รับข้อผิดพลาดสำหรับตารางที่ขาดหายไป
สาเหตุ
ปัญหาเหล่านี้เกิดขึ้นเนื่องจากการประมวลผลที่ชำรุดของคำสั่ง SELECT ที่ติดตามคำสั่งด้วย คำสั่งที่มีการใช้ไวยากรณ์ต่อไปนี้
WITH common_table_expression AS(CTE_query_definition)
คำสั่งนี้จะสร้างชุดผลลัพธ์ที่ได้รับมอบหมายให้กับชื่อนิพจน์ทั่วไปของตารางที่ระบุไว้ จากนั้นคุณสามารถทำตามคำสั่งนี้ได้ด้วยคำสั่ง SELECT ถ้าคำสั่งที่สองนี้อยู่ในวงเล็บและจากนั้นคุณพยายามทำการดำเนินการบนผลลัพธ์หรือคุณพยายามเรียกใช้มุมมองการจัดการแบบไดนามิก sys.dm_exec_query_stats คุณจะได้รับผลลัพธ์ที่ไม่ถูกต้องหรือข้อผิดพลาด
การแก้ไข
ข้อมูล service pack เมื่อต้องการแก้ไขปัญหานี้ให้ขอรับ service pack ล่าสุดสำหรับ SQL Server ๒๐๐๘ สำหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base:
๙๖๘๓๘๒ วิธีการขอรับ service pack ล่าสุดสำหรับ SQL Server ๒๐๐๘
วิธีแก้ไขปัญหาชั่วคราว
เมื่อต้องการแก้ไขปัญหาเหล่านี้คุณจำเป็นต้องเอาเครื่องหมายวงเล็บออกจากคำสั่งที่อยู่ถัดจากนิพจน์ตารางทั่วไป ตัวอย่างเช่นพิจารณาสิ่งต่อไปนี้ด้วยคำสั่งที่ใช้เครื่องหมายวงเล็บดังกล่าว
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
เมื่อต้องการแก้ไขปัญหาเหล่านี้ให้เปลี่ยนแปลงคำสั่งต่อไปนี้ด้วยคำสั่งที่ไม่ได้ใช้วงเล็บเหล่านี้
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
สถานะ
ไมโครซอฟท์ได้รับการยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งแสดงอยู่ในส่วน "นำไปใช้กับ" ปัญหานี้ได้รับการแก้ไขครั้งแรกใน SQL Server ๒๐๐๘ Service Pack 2 (SP2)
ข้อมูลเพิ่มเติม
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการใช้คำสั่งด้วยนิพจน์ตารางทั่วไปให้เยี่ยมชมเว็บเพจที่ MSDN ต่อไปนี้:
ด้วย common_table_expression (Transact SQL)สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ sys.dm_exec_query_stats แวะไปที่เว็บเพจที่ MSDN ต่อไปนี้: