ปัญหาของฉัน (หรืออย่างน้อยข้อความแสดงข้อผิดพลาด) คล้ายกันมากกับตัวประมวลผลแบบสอบถามที่ไม่มีทรัพยากรภายใน - แบบสอบถาม SQL ที่ยาวมากๆ
ลูกค้าของฉันกำลังทำงานกับ SQL select-query ซึ่งมี where-clause พร้อมกับ 100,000 รายการ
การค้นหาล้มเหลวด้วยข้อผิดพลาด 8632 และข้อความแสดงข้อผิดพลาด
ข้อผิดพลาดภายใน: ถึงขีด จำกัด บริการนิพจน์แล้ว โปรดค้นหานิพจน์ที่ซับซ้อนที่อาจเกิดขึ้นในข้อความค้นหาของคุณและลองทำให้มันง่ายขึ้น)
ฉันพบว่ามันแปลกมากที่ข้อความแสดงข้อผิดพลาดนี้ถูกส่งไปที่ 100,000 รายการดังนั้นฉันสงสัยว่านี่เป็นค่าที่กำหนดได้หรือไม่ นี่คือกรณีและในกรณีที่ใช่ฉันจะเพิ่มมูลค่านี้เป็นค่าที่สูงขึ้นได้อย่างไร
ในMSDNมีข้อเสนอให้เขียนแบบสอบถามซ้ำ แต่ฉันต้องการหลีกเลี่ยงปัญหานี้
ในขณะเดียวกันฉันพบว่ารายการของสิ่งที่ฉันพูดถึงมีจำนวนธรรมชาติ แต่บางรายการก็เรียงตามลำดับ (เช่น (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20)
สิ่งนี้ทำให้ SQL อยู่ตรงไหน - clause:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
ฉันสามารถแปลงให้เป็น:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
สามารถสั้นลงโดย:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... หรืออะไรทำนองนี้? (ฉันรู้ว่ามันใช้เวลานาน แต่จะทำให้การอัปเดตซอฟต์แวร์ง่ายขึ้นและอ่านง่ายขึ้น)
สำหรับข้อมูลของคุณ: ข้อมูลใน where-clause เป็นผลลัพธ์ของการคำนวณทำบนตารางอื่น: อันดับแรกรายการของตารางนั้นจะถูกอ่านและกรองที่จุดเริ่มต้นจากนั้นการประมวลผลพิเศษบางอย่างเกิดขึ้น (ซึ่งเป็นไปไม่ได้ที่จะใช้ SQL) ผลลัพธ์ของการประมวลผลพิเศษนั้นคือการกรองเพิ่มเติมและผลลัพธ์ของการประมวลผลที่ใช้ใน where-clause เนื่องจากเป็นไปไม่ได้ที่จะเขียนตัวกรองที่สมบูรณ์ใน SQL จึงใช้วิธีดังกล่าว เห็นได้ชัดว่าเนื้อหาของคำสั่งย่อยอาจเปลี่ยนแปลงได้ในทุกการประมวลผลดังนั้นความต้องการโซลูชันแบบไดนามิก
WHERE IN
ไม่ไม่รองรับไวยากรณ์ของช่วงนั้น นอกจากนี้ควรจะWHERE () OR () OR ()
ไม่และWHERE IN (SELECT myID FROM #biglist)
แต่การที่จะใช้ข้อเสนอแนะของเบรนต์ของคุณไม่จริงต้องเปลี่ยนแบบสอบถามทั้งหมดคุณก็สามารถทำได้ และ#biglist
อาจเป็นตารางจริง (ถาวร) หรือตารางชั่วคราวที่คุณทำได้ทันที