تجاوز سعة المكدس تحدث عند تشغيل استعلام يحتوي على عدد كبير من وسائط داخل IN أو عبارة "NOT IN" في SQL Server

الخطأ رقم: 235727 (shiloh_bugs)
الخطأ رقم: 58274 (sqlbug_70)

الأعراض

قد تؤدي الاستعلامات التي تحتوي على عدد كبير من الوسائط (بالآلاف) داخل IN أو عبارة NOT IN تجاوز سعة مكدس. على سبيل المثال، الاستعلام التالي يؤدي تجاوز سعة مكدس:

SELECT max(au_id) FROM authors WHERE au_id IN(1,2,5,......,11571)  -- Query contains over 11570 arguments.

يحتوي سجل خطأ SQL Server على معلومات مشابهة لما يلي عند حدوث تجاوز سعة المكدس:

2000-08-10 12:02:37.87 spid51    08/10/00 12:02:37 Stack Overflow Dump not possible - Exception c00000fd E at 0x00587286
2000-08-10 12:02:37.87 spid51 Address=587286 Exception Code = c00000fd
2000-08-10 12:02:37.87 spid51 eax=195922d0 ebx=19592338 ecx=2ad0e938 edx=00000007
2000-08-10 12:02:37.87 spid51 esi=196ce2c8 edi=19592180 eip=00587286 esp=2ac93000
2000-08-10 12:02:37.87 spid51 ebp=2ac93028 efl=00010202
2000-08-10 12:02:37.87 spid51 cs=1b ss=23 ds=23 es=23 fs=38 gs=0
2000-08-10 12:02:37.87 spid51 1: Return Address 00587286
2000-08-10 12:02:37.87 spid51 2: Return Address 0058728B.................

في بعض الحالات، قد SQL Server فعلياً إيقاف التشغيل نتيجة لتجاوز سعة المكدس.

الحل البديل

إعادة كتابة الاستعلام واستخدام جدول #temp لتحتوي على القيم في القائمة بدلاً من استخدام عبارة IN. على سبيل المثال، يمكن إعادة كتابة مثل هذا الاستعلام السابق:

CREATE TABLE #IN_values (au_id char(4))INSERT INTO #IN_values select au_id FROM Table_with_values_123456789...

SELECT max(au_id)
FROM authors as A
JOIN #IN_values as I ON (A.au_id = I.au_id)

الحالة

أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في بداية هذه المقالة.

مزيد من المعلومات

لم يتم قطع اتصال العميل ولكن قد تظهر رسالة الخطأ هذه:

الملقم: Msg 8621 17 من المستوى 1 حالة، "البند 2 خطأ معالج Query داخلي": معالج الاستعلام نفاد مساحة المكدس أثناء تحسين أداء الاستعلام.
خصائص

رقم الموضوع: 288095 - آخر مراجعة: 22‏/01‏/2017 - المراجعة: 1

تعليقات