2011-09-09 2 views
2

우리는 몇 PARAMS을 가지고 여기에 큰 틱 쿼리를 가지고 있고, 각각에 대해, 쿼리는 너무처럼 where 절의 한 부분에 의해 다릅니다TSQL에서 동적 조건부 검색을 수행하는 더 나은 방법은 무엇입니까?

CASE WHEN @IncludeNames = 1 AND @NameFilter IS NULL THEN

(SELECT blah FROM blahBlah

INNER JOIN ... 
    INNER JOIN ... 
    INNER JOIN ... 
    WHERE blahBlah.Id = x.Id) 

WHEN @IncludeNames = 1 AND @NameFilter IS NOT NULL THEN

(SELECT blah FROM blahBlah

INNER JOIN ... 
    INNER JOIN ... 
    INNER JOIN ... 
    WHERE blahBlah.Id = x.Id 
    AND table2.Id = @NameFilter 

여러 인스턴스의 경우 where 절의 조건 중 하나만 다른 경우가 있습니다.

큰 선택의 중간에 있다는 것을 명심하십시오. 다음과 같이

하나 개의 큰 연결된 SQL 문자열에 모두 배치하고 그 위에 exec 실행 또는 블록 당 다수의 저장 발동 같은 터무니없는 무언가를 사용하지 않고,이 청소하는 좋은 방법이 있나요 : http://www.developerfusion.com/article/7305/dynamic-search-conditions-in-tsql/7/

서버는 SQL Server 2008 R2입니다. 티아!

+0

'@IncludeNames = 0'을 확인하지 않습니까? 그렇다면 어떻게 될까요? –

+1

http://www.sommarskog.se/dyn-search-2008.html –

+0

한 번에 두 개 이상의 필터를 적용 할 수 있습니까? 이름과 신발 사이즈로? – HABO

답변

2

각 절의 전체 또는 특정 값 옵션을 사용하여 쿼리를 설정해보십시오.

SELECT x.* 
FROM x 
WHERE (x.id = @NameFilter 
OR  @NameFilter is null) 
AND (x.typeId = @typeFilter 
OR  -1 = @typeFilter) 
AND (x.date = @date 
OR  @date is null) 
AND (x.someStingType = @someStringType 
Or  '' = @someStringType) 

이렇게하면 절을 하나의 select 문으로 연결할 수 있습니다. 각 매개 변수는 필터를 적용하거나 아무 효과가 없습니다 (null, 빈 문자열 또는 -1과 같은 기본값으로 설정된 경우).

+1

다양한 필터 조건이 INNER JOIN의 적절한 ON 절로 펼쳐지면 옵티 마이저에서 읽기 쉽고 더 쉽습니다. – HABO

관련 문제