При выполнении запроса, содержащего большое количество аргументов внутри IN или предложение NOT IN в SQL Server происходит переполнение стека

Переводы статьи Переводы статьи
Код статьи: 288095 - Vizualiza?i produsele pentru care se aplic? acest articol.
Номер ошибки: 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, перечисленных в начале данной статьи.

Дополнительная информация

Клиент не отключен, но это появляется сообщение об ошибке:
Сервер: Сообщение 8621, уровень 17, состояние 1, строка 2 Внутренняя ошибка обработчика запросов: Обработчик запросов исчерпал пространство стека во время оптимизации запроса.

Свойства

Код статьи: 288095 - Последний отзыв: 5 июня 2011 г. - Revision: 5.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
Ключевые слова: 
kbprb kbpending kbmt KB288095 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:288095

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com