Při spuštění dotazu, který obsahuje velký počet argumentů uvnitř IN nebo NOT IN klauzule v serveru SQL Server dojde k přetečení zásobníku

Chyba č: 235727 (shiloh_bugs)
Chyba č: 58274 (sqlbug_70)

Příznaky

Dotazy, které obsahují velký počet argumentů (v tisících) uvnitř IN nebo NOT IN klauzule může způsobit přetečení zásobníku. Následující dotaz například způsobí přetečení zásobníku:

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

Pokud dojde k přetečení zásobníku, protokolu chyb serveru SQL Server obsahuje informace podobné následujícím:

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.................

V některých případech SQL Server může skutečně vypnutí v důsledku přetečení zásobníku.

Jak potíže obejít

Přepište dotaz a pomocí obsahují hodnoty v seznamu pomocí klauzule IN a v tabulce #temp. Předchozí dotaz může být například znovu písemné následujícím způsobem:

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)

Stav

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti uvedených na začátku tohoto článku.

Další informace

Klient není odpojen, ale tato chybová zpráva může zobrazit:

Server: Msg 8621, úroveň 17 stav 1, řádek 2 vnitřní dotaz procesoru chyby: procesoru dotaz nemá dostatek místa zásobníku během optimalizace dotazu.
Vlastnosti

ID článku: 288095 - Poslední kontrola: 23. 1. 2017 - Revize: 1

Váš názor