2012-02-20 2 views
-1

UI에서 전달 된 매개 변수를 기반으로 값을 검색하기 위해 SQL Server 2005에 저장 프로 시저가 있습니다.검색 작업을위한 저장 프로 시저

이것은 기본적으로 많은 테이블이있는 JOIN 인 이름에 대한 검색 작업입니다. 내 문제는 사용자가 중간 이름을 제공하지 않으면 프로 시저가 해당 값에 액세스 할 수 없다는 것입니다.

P.FirstName = Coalesce(@FirstName,P.FirstName) AND 
    P.MiddleName = Coalesce(@MiddleName,P.MiddleName) AND 
    P.LastName = Coalesce(@LastName,P.LastName) AND 
    (
     P.FirstName = Coalesce(@anyName,P.FirstName) OR 
    P.MiddleName = Coalesce(@anyName,P.MiddleName) OR 
    P.LastName = Coalesce(@anyName,P.LastName) 
    ) 

위의 모든 열에 필터 옵션을 제공하기 때문에 중간 이름을 제거 할 수 없습니다.

+1

[T-SQL의 동적 검색 조건] (http://www.sommarskog.se/dyn-search.html) - 'MiddleName'이 Null을 허용하는 것으로 추측되며 'NULL' = NULL' 함정. –

답변

0

이이

CASE WHEN @FirstName IS NULL THEN CASE WHEN P.FirstName is NULL THEN 1 ELSE 0 END 
    ELSE CASE WHEN P.FirstName = Coalesce(@FirstName,P.FirstName) THEN 1 ELSE 0 END 
     END = 1 
0

변화 같은 것을 시도 : 여기

(P.MiddleName = @MiddleName or P.MiddleName is null or @MiddleName is null) 

전체 예는 다음과 같습니다

(P.FirstName = @FirstName or P.FirstName is null or @FirstName is null) AND 
(P.MiddleName = @MiddleName or P.MiddleName is null or @MiddleName is null) AND  
(P.LastName = @LastName or P.LastName is null or @LastName is null) AND  
( @AnyName is null or 
    P.FirstName = @AnyName or 
    P.MiddleName = @AnyName or  
    P.LastName = @AnyName) 
+0

당신이 제안한 것과 같은 것을 만든 후에 내 필터 옵션이 선전없이 작동합니다. – LovingMVC

0
where (MiddleName = Coalesce(@MiddleName ,MiddleName) or MiddleName is null) 

은에 그것을 할 것을 잊지 마세요 두 위치를 참조하는 중간 이름