2012-06-11 3 views
2

그래서 나는이 쿼리가 있습니다. 문제는 검색 모델을 기반으로 WHERE 절이 동적으로 존재한다는 것입니다. 어떻게 쿼리를 매개 변수화 할 수 있습니까? 사용자가 모든 열을 기반으로 검색 할 필요가 없어야하므로 WHERE a = @A AND [email protected]을 넣을 수 없습니다.매개 변수화 된 쿼리는 어디에 clasue

아이디어가 있으십니까? 미리 감사드립니다.

P.S : LINQ 또는 이와 유사한 (-business rules-)을 사용할 수 없습니다.

+0

비즈니스 규칙에 따라 구현이 결정됩니까? 그것들은 비즈니스 규칙처럼 들리지 않습니다. –

답변

3

close (WHERE는 동적 일 수 있음)와 함께 SQL 매개 변수화 된 쿼리를 계속 사용할 수 있습니다. 예를 들어 나는 매개 변수 @SerialNum이 NULL이고 455와 같은 @code 매개 변수를 가지고 있습니다.

SELECT 
    Column1 
    ,Column2 
FROM 
    YourTable 
WHERE 
    (
     @SerialNum IS NULL 
     OR 
     Column3 LIKE '%' + @SerialNum + '%' 
    ) 
    AND 
    (
     @Code IS NULL 
     OR 
     Column4 LIKE '%' + @Code + '%' 
    ) 
+0

이것은 프로그램 코드에서 if 문을 피하는 가장 쉬운 방법입니다. – goat

+0

개인적으로 나는 이것이 SQL 엔진에있는 모든 것보다 내 방식보다 더 좋다고 생각합니다! 하지만 MYSQL 용 코드를 업데이트 할 수 있습니까? –

+0

@ fenix2222 Brilliant! 물론 훌륭합니다. 감사! –

1

이 트릭을 사용합니다.

.... 
WHERE 1 = 1 
AND a = a 
AND b= @b 
AND c = c 
... etc.... 

내가

var comm = @"SELECT * FROM `TABLE` WHERE 1 = 1 "; 

if (model.Serial > 0) { 
    comm += " AND `SERIAL` LIKE '%" + model.Serial + "%' "; 
} else { 
     comm += " AND `SERIAL` = `SERIAL`"; 
} 


if (model.Id.HasValue && model.Id.Value > 0) {  
    comm += " AND `AND` LIKE '%" + model.Id.Value + "%' ";  
} else { 
     comm += " AND `NUIP` = `NUIP` ";  
} 
.... 

WHERE 1 = 1 멀리 최적화되어 검색 할과 WHERE 아직 여부를 정의 된 경우 기억해야 할 필요성을 제거하지 않으면 내가 자기에 열을 비교 즉, 및 모든 검색이 최적화되어 (AND a=a) 검색이 적용됩니다 (AND a = xxx).

검색 할 때마다 if을 하나만 추가하면됩니다.

또한 문자열 처리를 정리하기 위해 StringBuilder를 사용합니다.

+0

+1을 제거하려면 그 곳! 참으로 그 질문에 대한 어떤 생각 (매개 변수화 된 버전). 감사 코드 –