제목 : 도움이 되실지...(다 아시는건 아닌지...틀릴수도 >.,<)
글번호:
|
|
1117
|
작성자:
|
|
hatukoi
|
작성일:
|
|
2006/05/17 오후 3:04:00 (2006/05/17 오후 4:56:00 수정)
|
조회수:
|
|
2768
|
저도 비슷한 기능의 프로시저를 끙끙대며 만든적이 있지만 역시 저도 초짜인지라
팀장님-맞나요?^^;-이 주신걸 대번에 이해하기는 어렵네요 ㅎㅎ
제가 짠것도 아니고 말이죠;;
아무튼 일단 프로시저 보니까 이미 where절까지 갖춰진 것이군요.
소스를 쭉 훓어보니 거의 끝에 있는 select문을 실행하기 전에 그 조건들을 미리 설정하네요.그리고,테이블까지 변수처리 하는것 보니 여러 곳에서 동시에 쓰는 프로시저네요.
변수가 많아서 자칫 헷갈리시겟지만-저도 헷갈립니다;;-그냥 편하게 자신이 넣어줄
값들을 쭉 나열해보심은 어떠신지요.
그걸 변수에 채워넣다보면 어떤 변수를 어느자리에 넣어야 하는지 감이 잡히지 않을까 싶습니다.
일단 실제 조회부분 가면 3가지로 나뉘네요.
1.페이징 없이 그냥 무조건 다 출력
2.페이징 없이 다 출력
3.페이징 있는 검색출력
마지막 3번만 이해 하시면 다 되겟지여...그게 실행되야 하는거구요.
3번쪽 쿼리를 보면
EXEC (
'SELECT ' + @strFields + ' FROM ' + @strTables + ' WHERE ' + @strPK + ' IN ' + '
(SELECT TOP ' + @strPageSize + ' ' + @strPK + ' FROM ' + @strTables +
' WHERE ' + @strPK + ' NOT IN ' +
' (SELECT TOP ' + @strSkippedRows + ' ' + @strPK + ' FROM ' + @strTables + @strFilterCriteria + @strGroupCriteria + @strSortCriteria + ' ) ' +
@strSimpleFilter + @strGroupCriteria + @strSortCriteria + ' ) ' +
@strGroupCriteria +
@strSortCriteria
)
가장 안쪽 쿼리의 핵심은 @strSkippedRows 입니다.
페이징에 의해 빠질 부분들을 뽑아내는 쿼리 같습니다.즉,실제 보여줘서는 안되는
부분입니다.그걸 구하는데 보시면 @strPK 만 뽑아냅니다 pk값이죠.
그런데 페이징과 동시에 이루어져야 할게 검색입니다.
즉, 단순히 페이징만 이루어지면 전체에서 페이징에서 빠질 부분만 추리므로 실제
검색으로 인해서 빠져야 할것들이 안빠지죠
그래서, @strFilterCriteria 부분이 들어갑니다.
잠깐 보충하자면 저도 얼마전에 깨달은건데 쿼리문에서 가장 먼저 실행되는것은
from 절 이하부분이라는것입니다.
즉, from 테이블명 where 조건 order by 정렬 부분을 먼저 해서 원하는 테이블을
구성 한후에 select 를 한다는 것이죠.
그 후 그걸 감싸는 쿼리를 보시면 빠져야 할 데이타들의 pk값을 비교하여
그 pk값이 아닌것들만으로 이루어진 데이타를 출력합니다.
그런데역시나 같은 검색조건 같은 정렬 같은 그룹바이 변수를 이용합니다.
마지막에는 결국 그 데이타들중에서 pk값이 들어잇는 것들만 골라서 보여줄 필드명을
출력하는군요
결론 지어 보면 //여기서 전체데이타는 검색을 거친후의 데이타입니다.
내가 보여줄 필드 를 출력 from 테이블
where pk in (실제 보여줄 데이타 pk값 출력 from 테이블명 where
pk not in (전체 데이타중 페이징에 의해 빠지는 데이타의 pk)
)
정도 되는거 같습니다.더 정신없네요;;
여기서 주의할점은 페이징시에는 정렬을 똑같이 빼먹지 말고 줘야 한다는 겁니다.
자칫 잘못하면 제대로 된 패이징이 안되는게 TOP에 의해 최상단 값부터 나오기 때문입니다.
가장 하위쿼리와 그걸 싸고 잇는 하위쿼리에 있는 조건의 변수가 틀린점도 유의하세요.
조건(검색조건)이 같은데 왜 변수명이 틀릴까요
첫번째(@strFilterCriteria)는 바로 where절부터 출발하지만
두번째것( @strSimpleFilter )은 and로 출발합니다.
두번째 것은 PK값 Not In (최단 하위쿼리) and 조건...식이기 때문입니다.
where절이 걱정이시라면 이 부분을 잡아주시면 되겟습니다.
단,전체문장을 고려해서 띄어쓰기 확실히 해주시구요.검색조건이 난해할 경우
위 부분이 엄청 길어질수 있습니다.오죽하면 varchar(8000)으로 잡았겟습니까.
if else구문이야 시샵과 유사하니 아실테구요...
헉헉 적고 보니 더 정신이 없네요 말로 하면 별거 아닐수 잇는데...
저도 아는데로 적은거라 틀릴수 있다는 점 알아주시구여 -0-;
P.S 그런데 저 같으면 그냥 이렇게 햇을거 같네요.
@PageSize - 한번에 보여줄 데이타 수
@PageNum - 현재 페이지값
select top @PageSize * from 테이블
where pk not in
(
select top @PageSize*(@PageNum-1) pk from 테이블
where 검색조건 order by 정렬
)
and 검색조건 order by 정렬
|
hatukoi
2006-05-17 오후 3:07:07
|
쿼리에서 문장완성시 박선생님이 강조하신걸 잊지마세요.
'을 표현하려면 '을 3개찍어라! 라는것이요^^;;
|
|
|
|