Estouro de pilha ocorre quando você executa uma consulta que contenha um grande número de argumentos dentro de um IN ou uma cláusula IN não no SQL Server

ID do artigo: 288095 - Exibir os produtos aos quais esse artigo se aplica.
Erro nº: 235727 (shiloh_bugs)
Erro nº: 58274 (sqlbug_70)
Expandir tudo | Recolher tudo

Sintomas

Consultas que contêm um grande número de argumentos (milhares) dentro de um IN ou uma cláusula IN não podem gerar um estouro de pilha. Por exemplo, a consulta a seguir resulta em um estouro de pilha:
SELECT max(au_id) FROM authors WHERE au_id IN(1,2,5,......,11571)  
-- Query contains over 11570 arguments.
				
log de erros a do SQL Server contém informações semelhantes à seguinte quando o estouro de pilha ocorre:
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.................
				
Em alguns casos, o SQL Server pode realmente desligamento como resultado de estouro de pilha.

Como Contornar

Reescrever a consulta e use uma tabela #temp para contêm os valores na lista IN em vez de usar uma cláusula IN. Por exemplo, a consulta anterior pode ser re-written assim:
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)
				

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no começo deste artigo.

Mais Informações

O cliente não for desconectado, mas essa mensagem de erro pode ocorrer:
Mensagem de servidor: 8621, 17 de nível, estado 1, erro de processador de consulta interno linha 2: O processador de consultas ficou sem espaço de pilha durante a otimização de consulta.

Propriedades

ID do artigo: 288095 - Última revisão: sexta-feira, 2 de novembro de 2007 - Revisão: 4.4
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
Palavras-chave: 
kbmt kbprb kbpending KB288095 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 288095

Submeter comentários