2011-03-23 6 views
0

학생 (테이블 행)을 필터링하는 데 사용되는 외래 키가 많은 Student라는 테이블이 있습니다. 하나 이상의 언어를 말할 수있는 학생으로많은 필터를 사용하는 SQL Server 테이블 행

StudentId GenderId DegreeId NatioanlityId 
     1   2   2   3 
     .... 

가의 Sudent 표이

 StudentId LangaugeId 
     1   1 
     1   2 
     1   3 

그리고 학생 수와 같은 언어 테이블에 연결되어 있습니다 :

이 테이블의 구조는 같다 시험을 위해 하나 또는 여러 과목을 선택했습니다 :

 StudentId  ExamId 
     1    1 
     1    2 
     .... 

내 asp.net 페이지에서 st 예를 들어, Ajax 을 사용하여 확인란을 통해 udents 학생 1, 학위 1,2 언어로 말하기 여성과 남성의 성별을 가지고 ... 나는 사용자 정의 테이블을 사용하여 저장된 proc의 행을 필터링하고, 나는 IF 문을 많이 사용해야합니다. 이 경우

  if(EXISTS(SELECT DegreeId FROM @DegreeTable)) 

     if(....) 
     else 
     if(...) 

가 어떻게 모든 IF 문을 방지 할 수 있습니다 (() @GenderTable FROM GenderId을 선택 EXISTS)? 나는 5 개 이상의 필터를 가지고있다. 지루하다. 어떤 아이디어라도 있으십니까?

미리 감사드립니다.

+0

왜 "성별"에 대한 조회 표가 있습니까? – Prisoner

+0

DB를 쿼리하여 확인란 옵션을 생성합니까, 아니면 페이지에 고정 배선되어 있습니까? 또한 언어에 대해 하나 이상의 언어를 검사 할 수있는 것처럼 보입니다. 여러 언어가 선택되어 있다면 두 언어를 사용하는 학생을 선택하겠습니까? –

+0

맞습니다. Joel입니다. 학생은 하나 또는 여러 언어로 필터링 할 수 있습니다. 문제는 성별 검사가 아닐 수 있습니다 : 예를 들어 언어별로 필터링하고 성별 검사, 학위 검사, 저장된 proc의 필터 결합 ... 알 겠어? –

답변

1

귀하의 검색어가 기준을 충족하는 학생의 목록을 반환한다고 가정합니다. 이 작업을 수행 할 수 있도록 하나의 방법이 형식

Where 
    (@Param1 IS NULL OR Field1 = @Param1) 
    AND (@Param2 IS NULL OR Field2 = @Param2) 

이 추한 얻을 수 있으며, 사용 대 가능하고 인덱싱 방법을 구축 얼마나 많은 필터에 따라 잘 작동하지 않을 수 있습니다 다음 where 절을 구축하는 것입니다 경우.

또 다른 옵션은 동적 SQL을 사용하는 것입니다. .net 코드 또는 SQL 저장 프로 시저에서 생성 할 수 있습니다. 기본적으로의 라인을 따라 뭔가와 끝까지 :

Set @Query = /* base select statement */ 
If @Param1 IS NOT NULL 
    Set @Query = @Query + 'AND Field1 = @Param1' 
If @Param2 IS NOT NULL 
    Set @Query = @Query + 'AND Field2 = @Param2' 
Exec sp_executesql @Query, @ParamList, @Param1, @Param2 

이 읽고 디버그가 훨씬 더 힘들어 얻을 수 있지만 실제로에 대해 필터링되고있는 필드에서 찾고 있기 때문에 그것은 일반적으로 더 나은 수행합니다. 그러나 동적 SQL을 사용하는 경우주의해야 할 몇 가지 중요한 점이 있습니다. Injection Attacks가 목록 상단에 있습니다. http://www.sommarskog.se/dynamic_sql.html은 동적 SQL에서 수행해야 할 작업과 수행하지 말아야 할 작업에 대한 훌륭한 자료입니다.

+0

좋은 시작이지만, 가치있는 필터.예를 들어 영어와 스페인어를 구사하는 학생 만 선택하는 단일 필터가있는 경우를 생각해보십시오. 특정 학생의 경우 두 언어를 모두 구사할 수있는 유일한 분야는 없습니다. –

+0

사실, 나는 그 점을 글로 나타내었다. 내가 전에 그 requirment를 처리하는 방법은 .net에서 구분 된 문자열을 작성하고 SQL의 분할 함수를 통해 실행 한 다음 일치하는 행에 필러에 '내부 결합'또는 'IN'critera를 사용합니다. 체크 된 항목 대신에 체크 된 항목이 모두 있지만 여전히 수행 할 수있는 사람을 찾는 것이 목표라면 속임수가 적용됩니다. – Rozwel

+0

@Joel 둘 이상의 지연이 선택되면 사용자 정의 테이블 유형을 사용할 수 있습니다. –

관련 문제