내 문제 (또는 적어도 오류 메시지)는 쿼리 프로세서에 내부 리소스가 부족한 매우 긴 SQL 쿼리 와 매우 유사 합니다 .
고객이 정확히 100,000 개의 항목이있는 where-clause를 포함하는 SQL select-query를 사용하고 있습니다.
오류 8632 및 오류 메시지와 함께 쿼리가 실패합니다
내부 오류 : 식 서비스 제한에 도달했습니다. 쿼리에서 잠재적으로 복잡한 표현식을 찾아서 단순화하십시오.)
이 오류 메시지가 정확히 100,000 개의 항목에 표시되는 것이 매우 특이하므로 이것이 구성 가능한 값인지 궁금합니다. 이 경우에 해당합니까? 그렇다면이 값을 더 높은 값으로 늘리려면 어떻게해야합니까?
에 MSDN ,이 쿼리를 다시 재 작성 할 수있는 제안이지만, 나는이 문제를 방지하고 싶습니다.
한편 나는 내가 말하는 항목 목록에 자연수가 포함되어 있음을 발견했으며, 그중 일부는 순차적 인 것처럼 보입니다 ((1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
이것은 SQL where-clause를 다음과 같이 만듭니다.
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
나는 이것을 다음으로 바꿀 수있다 :
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
이를 통해 다음을 단축 할 수 있습니까?
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... 또는 비슷한 것? (긴 샷이지만 소프트웨어 업데이트를 더 쉽고 읽기 쉽게 만듭니다)
정보 : where-clause의 데이터는 다른 테이블에서 수행 된 계산 결과입니다. 먼저 해당 테이블의 항목을 처음에 읽고 필터링 한 다음 추가 처리가 수행됩니다 (사용할 수 없음) 추가 처리의 결과는 더 많은 필터링이며 결과는 where 절에서 사용됩니다. SQL에서 전체 필터링을 작성하는 것이 불가능했기 때문에 언급 된 방법이 사용되었습니다. where-clause의 내용은 모든 처리에서 변경 될 수 있으므로 동적 솔루션이 필요합니다.
WHERE IN
해당 종류의 범위 구문을 지원하지 않습니다. 또한WHERE () OR () OR ()
AND 가 아니 어야합니다 . 그러나 브렌트의 제안을 사용하기 위해 실제로 전체 쿼리를 변경할 필요는 없습니다WHERE IN (SELECT myID FROM #biglist)
. 그리고#biglist
실제 (영구적) 테이블 또는 임시 테이블 일 수도 있습니다.