Почему я получаю сообщение об ошибке «Сервер обнаружил переполнение стека во время компиляции» SQL Server 2000 Sp4 - PullRequest
0 голосов
/ 07 января 2009

Я пытаюсь получить около 6290 условий «И» в этом запросе. Я получаю то же самое примерно для 11945 условий «ИЛИ».

Сведения об исключении: Сервер обнаружил переполнение стека во время компиляции. на System.Data. lClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException , Boolean breakConnection)

Ответы [ 2 ]

2 голосов
/ 07 января 2009

Попробуйте и оптимизируйте условия И / ИЛИ.

SELECT * FROM foo
WHERE ([fooKey] = 1 AND Year = 1995)
OR ([fooKey] = 1 AND Year = 1996)
OR ([fooKey] = 1 AND Year = 1997)
OR ([fooKey] = 1 AND Year = 1998)
OR ([fooKey] = 1 AND Year = 1999)
OR ([fooKey] = 1 AND Year = 2000)
OR ([fooKey] = 1 AND Year = 2001)
OR ([fooKey] = 1 AND Year = 2002)
... ad infinitum

становится

SELECT * FROM fooWHERE ([fooKey] = 1 AND Year between 1995 and 2002)
union
SELECT * FROM fooWHERE ([fooKey] = 10017 AND Year = 1995)
union
SELECT * FROM fooWHERE ([fooKey] = 10018 AND Year = 1997)
... slightly less

Или перейдите на 64-разрядную версию и попробуйте добавить достаточно памяти, чтобы этого не произошло ...

1 голос
/ 07 января 2009

Интересная ошибка! Очевидный вопрос, который вам следует задать, это: почему? Переполнение стека происходит потому, что рекурсия - это типичный способ синтаксического анализа оператора SQL, который создает синтаксическое дерево. В зависимости от того, что помещается в стек при каждом рекурсивном вызове, это не удивительно. Это повредило серверу? ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...