2016-08-01 2 views
0

어쩌면이 작업을 수행 할 수 없으며 (SQL 문자열을 실행하는 것 외에는) 여러 가지 방법을 시도했지만 기본적으로 양쪽에 동적 where 절을 작성하려고합니다. 변수로서의 조건.SQL 서버 동적 where 절에 변수가있는 경우

내가 좋아하는 뭔가가 필요 (하지만 작동) :

WHERE 0 = 0 
    AND (
     (CASE @dateCondition 
      WHEN 'DateCreated' THEN DateCreated 
      WHEN 'DueDate' THEN DateCreated 
      WHEN 'CompletionDate' THEN DateCreated 
     END) = @dateFrom) 

또는 본질적으로

WHERE @dateCondition = @dateFrom 
+0

@dateCondition의 값에 따라 IF-ELSE 문에서 세 번째 변수에 where 절의 값을 설정 한 다음 동적 SQL을 작성합니다. 즉, 2 단계로 수행하십시오. – Melanie

+0

'1 = 1'이 작동 할 수 있습니다. – prograshid

답변

0

내가 프런트 엔드 쿼리에 몇 년 동안 루프에서 봤는데,하지만 일반적으로 (물론, 역사적으로) 나는 같은 것을 할 것 :

WHERE 1 = 1 
    AND (
      (@dateCondition = 'DateCreated' AND DateCreated = @dateFrom) 
     OR (@dateCondition = 'DueDate'  AND DueDate = @dateFrom) 
     OR (@dateCondition = 'CompletionDate' AND CompletionDate = @dateFrom) 
    ) 

내 응용 프로그램에 따라하지만, 나는 할 수있다 코드에서 동적으로 쿼리를 작성하십시오.

항상 NULL 매개 변수를주의하십시오.

0

물론 내가 질문을 게시하자마자 알아낼 수 있습니다.

다음은 현재 사용중인 것입니다. 더 효율적인 솔루션이 있다면 알려주십시오.

사실 두 가지 솔루션 :

1.

AND 
     CASE 
      WHEN @dateCondition = 'DateCreated' AND DateCreated >= @dateFrom 
      THEN 1 
      WHEN @dateCondition = 'DueDate' AND DateCreated >= @dateFrom 
      THEN 1 
      WHEN @dateCondition = 'CompletionDate' AND DateCreated >= @dateFrom 
      THEN 1 
      ELSE 0 
     END = 1 

2.

AND DateCreated >= CASE 
          WHEN @dateCondition = 'DateCreated' 
          THEN @dateFrom 
          ELSE DateCreated 
         END 

... 변수를 가정

0

는 사전에 간단한 방법을 설정 동적 쿼리를 작성하는 것입니다. 변수가 명시 적으로 설정되지 않은 경우

DECLARE @date DATE = SELECT 
          CASE @dateCondition 
           WHEN 'DateCreated' THEN DateCreated 
           WHEN 'DueDate' THEN DateCreated 
           WHEN 'CompletionDate' THEN DateCreated 
          END 
        FROM [ . . . ] 

DECLARE @sql NVARCHAR(MAX) = 
    'SELECT * 
     FROM [. . .] 
     WHERE 
      @date = @dateFrom 
    ' 

EXEC sp_executesql @sql, N'@date DATE, @dateFrom DATE', @date, @dateFrom 

이,하지만, 그래서 그것은 길을 가야하는 보안 구멍이 아니에요있다.

0

당신은 당신이 또는 생각하는 경우에 따라 동적 SQL을

CASE WHEN @dateCondition ='DateCreated' AND DateCreated = @dateFrom THEN 1 ELSE 0 END = 1 
OR 
CASE WHEN @dateCondition ='DueDate' AND DueDate= @dateFrom THEN 1 ELSE 0 END = 1 
OR 
CASE WHEN @dateCondition ='CompletionDate' AND CompletionDate= @dateFrom THEN 1 ELSE 0 END = 1 

또는 다음과 같이

CASE WHEN @dateCondition ='DateCreated' THEN DateCreated ELSE @dateFrom END = @dateFrom 
AND 
CASE WHEN @dateCondition ='DueDate' THEN DueDate ELSE @dateFrom END = @dateFrom 
AND 
CASE WHEN @dateCondition ='CompletionDate' THEN CompletionDate ELSE @dateFrom END = @dateFrom 

필요하지 않습니다 또는 당신이 생각과

는 개인적으로 나는 생각합니다.