Meu problema (ou pelo menos a mensagem de erro) é muito semelhante ao processador de consultas que ficou sem recursos internos - consulta sql extremamente longa .
Meu cliente está trabalhando com uma consulta de seleção SQL, contendo uma cláusula where com exatamente 100.000 entradas.
A consulta está falhando com o erro 8632 e a mensagem de erro
Erro interno: um limite de serviços de expressão foi atingido. Procure expressões potencialmente complexas em sua consulta e tente simplificá-las.)
Acho muito peculiar que essa mensagem de erro seja lançada, exatamente com 100.000 entradas, então, me pergunto se esse é um valor configurável. É esse o caso e, no caso afirmativo, como posso aumentar esse valor para um valor mais alto?
No MSDN , existe a proposta de reescrever a consulta, mas eu gostaria de evitar isso.
Enquanto isso, descobri que a lista de entradas de que estou falando contém números naturais, alguns deles parecem ser seqüenciais (algo como (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Isso torna a cláusula where do SQL algo como:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Eu poderia transformar isso em:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Isso pode ser reduzido por:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... ou algo parecido? (Eu sei que é um tiro no escuro, mas isso tornaria as atualizações de software mais fáceis e legíveis)
Para sua informação: os dados na cláusula where são o resultado de um cálculo, feito em outra tabela: primeiro, as entradas dessa tabela são lidas e filtradas no início e, em seguida, algum processamento extra é feito (o que é impossível fazer usando SQL), o resultado desse processamento extra é mais filtrado e o resultado disso é usado na cláusula where. Como era impossível gravar a filtragem completa no SQL, o método mencionado foi usado. Obviamente, o conteúdo da cláusula where pode mudar a cada processamento, daí a necessidade de uma solução dinâmica.
WHERE IN
não suporta esse tipo de sintaxe de intervalo. Além disso, não deve serWHERE () OR () OR ()
AND. Mas, para usar a sugestão de Brent, na verdade você não precisa alterar a consulta inteira, basta fazê-loWHERE IN (SELECT myID FROM #biglist)
. E#biglist
pode ser uma tabela real (permanente) ou uma tabela temporária criada em tempo real.