2017-11-14 6 views
0

SQL Server에 저장 프로 시저가 있습니다. 다음과 같이 SP의 SELECT 부분은 다음과 같습니다 WHERE 절의 AND 부분에서 CASE 또는 IF..ELSE 사용

SELECT * FROM demoTable dt 
INNER JOIN demoTable2 dt2 
WHERE 
     (@StartDate IS NULL OR dt.StartDate = @StartDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate)) 
     AND (@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate))  

지금 내가 위의 수정하려는 위치를 AND 조건 후 절 부분입니다. 이 SP에 전달되는 3 개의 새 매개 변수/변수를 추가했습니다. 나는 절은 다음과 같이 WHERE보다 조작하기 위해 노력하고있어 이들 변수의 값을 사용

@ID int , @isAdmin int and @Date varchar(50) 

:

WHERE 
    @StartDate IS NULL OR dt.StartDate = @StartDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate)) 
    -- Logic change below   
    AND(
    CASE WHEN (@ID != 100 AND @isAdmin != 1) 
    THEN (@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate))  
    ELSE (dt.EndDate>sysdatetime()) 
    END) 

그러나 수정 후 내가 오류가 발생하고있어

.

Error 문 :이 오류는 내가 사용했던 라인 가리키는

Incorrect syntax near the keyword 'IS'. 

수정 된 로직 부분에서 NULL입니다.

(@ID != 100 AND isAdmin != 1) 

이 사실이 보유하고 그렇지 않으면 내가 새로운 논리의 예를 적용 할 경우에만

기본적으로 내가하고 싶은

(@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate))  

에 대한 원래의 논리를 적용하는 것입니다

(dt.EndDate>sysdatetime() 

어떻게하면됩니까?

+0

그 이유는 알지 못합니다. 좀 더 간단한 것을 시도해 봤고 휴식을 취할 때까지 추가 했습니까? CASE'같은 뭔가를 시작할 때 @ID! = 100 ELSE FALSE 'THEN 사실 (@StartDate가 null –

+0

STARTDATE 난 당신이 단지에서 @ – KinSlayerUY

+0

@KinSlayerUY 누락 생각 NULL IS WHERE 대 case db는'dt.StartDate'를 참조하고 있다고 생각합니다 –

답변

2

당신이 원하는 경우

변화 단지 유효한 부울 표현식 필요로 할 때, 당신은/케이스 필요하지 않습니다 @ID !=100 AND isAdmin !=1

위한 특별한 조건 :

AND(
    CASE WHEN (@ID != 100 AND isAdmin != 1) 
    THEN (@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= 
@StartDate and dt.EndDate <= @EndDate))  
    ELSE (dt.EndDate>sysdatetime()) 
    END 
) 

AND(
    ((@ID != 100 AND isAdmin != 1) AND (@EndDate IS NULL OR dt.EndDate = @EndDate OR (dt.StartDate >= @StartDate and dt.EndDate <= @EndDate)))  
    OR 
    ((@ID == 100 OR isAdmin == 1) AND (dt.EndDate>sysdatetime())) 
) 
에를
+0

그 두 가지가 유사하다고 생각하지 않습니다. –

+0

마지막 AND는 "OR"이어야합니다 ... –

+0

@Indent nop e 이것은 필자에게 필요한 결과를주지 못했습니다. –