제목 : Re : 게시판 저장프로시저(SP) 목록 페이징처리한거 만드는건데요..
글번호:
|
|
446
|
작성자:
|
|
고영태
|
작성일:
|
|
2007/03/09 오후 1:44:00
|
조회수:
|
|
3681
|
조금은 어려운 쿼리문이지만 이 쿼리문을 님의 것으로 만든다면 정말 좋은 예제 입니다.
물론 비 효율적이기는 하지만..
이 쿼리문은 가지고 계시다가 나중에라도 꼭 님의 것으로 만드시길..
그리고 게시판 쿼리문은 게시판 종류에 따라 바뀌기 때문에 찾아다니기보단
이해한다음에 거기에 맞는 쿼리문을 작성하시는게 좋습니다.
처음부터 잘하는 사람은 없으니 열심히 하셔서 대박나시길..
On 2007-03-09 오전 1:56:00, '서방원' wrote:
------------------------------------------------------------
>안녕하세요...제가 회사 수습으로 현재 교육을 받고 있는데 이번 과제였던 게시판 구현을위해 저장프로시저로 게시판 목록을 20개씩 나눠서 표현을 할수있게 만드는거였습니다.
>아쉽게도 혼자 구현을 못하고...(ㅡㅡ; 머리가 딸린지 계속 제자리 걸음만 3일간했음).
>결국....회사에서 참고하라고준 쿼리문을 보고 복사해 붙여넣기 방식으로 했습니다.
>한번보시고 이보다 좋은 방법이나 다른 구현 방법있으시면 좀 가르쳐주세요.... 많은 답변 부탁드립니다.ㅠㅠ 수습3개월을 버티긴 버티겠지만....조금이라도 내꺼로 만들어야겠다는 생각에 다른 방법도 알아보는데 쉽게 안나와서...
>
>
>--=======================================================================================
>-- 게시판 리스트
>--
>--=======================================================================================
>-- 사용자 함수 생성
>-- 해당 글의 댓글수
>CREATE function get_comment_count (@board varchar(50),@idx int)
>returns int
>as
>begin
>declare @comment_count int, @board_comment varchar(20) -- @comment_count 해당글의 댓글수 / @board_comment 게시판 테이블명
>begin
>
> if @board = 'free_board'
> begin
> select @comment_count=count(*) from free_board_comment where _parent_idx = @idx and active_state = 1
> end
>
> --set @sql = 'set @board_comment = '+@board+'_comment'
> --set @sql = @sql + 'select @comment_count=count(*) from '+@board_comment+' where idx = '+@idx
> --execute(@sql)
>end
>return (@comment_count)
>end
>
>-- 저장 프로시저
>create proc lsw_free_board_list
> @start_idx int =1, -- 해당페이지에서 시작될 글 번호
> @page_size int = 20, -- 한페이지당 보여줄 글수
> @search int = 0, -- 조건문
> @search_sdate varchar(10) = '', -- 검색 날짜 부터~
> @search_edate varchar(10) = '', -- 검색 날짜 까지
> @search_field varchar(20) = '', -- 검색 조건
> @search_txt varchar(100) = '' -- 검색 단어
>AS
>set nocount on
>declare @sql varchar(5000)
>declare @length int
>set @length=50
>if (@start_idx is null) or (@start_idx < 1)
>begin
> set @start_idx = 1
>end
>if (@page_size is null) or (@page_size <1)
>begin
> SET @page_size =10
>end
>
>-- 검색문
>declare @search_str varchar(100)
>set @search_str = ''
>if @search = 1
> set @search_str = ' and Write_time >= '''+@search_sdate+''' and
> write_time <= '''+convert(varchar, dateadd(d, 1, @search_edate), 23)+''''
>else if @search = 2
> set @search_str = ' and '+@search_field+' like '+'''%'+@search_txt+'%'' '
>else if @search = 3
> set @search_str = ' and write_time >= ' +@search_sdate+' and
> wriite_time <= '''+convert(varchar, dateadd(d, 1, @search_edate), 23)+''' and
> '+@search_field+' like '+'''%'+@search_txt+'%'' '
>
>-- 임시테이블 생성
>set @sql=
> '
> declare @start_idx int, @page_size int, @count int, @b_idx int
> declare @boardtable table (
> idx bigint not null,
> id varchar(15) not null,
> name varchar(20) not null,
> aca_name varchar(30) null,
> hit int null,
> praise int null,
> membertype int null,
> write_time datetime null,
> subject varchar (100) null,
> contents text null,
> fname varchar(100) null,
> ftype varchar(30) null,
> fencodename varchar(200) null,
> active_state int not null
>)
>set transaction isolation level read uncommitted
>'
>
>-- 가져올 글 수에 대한 공간 확보
>set @sql = @sql + '
> set @start_idx = ' + convert(varchar, @start_idx)+
> '
> set @page_size = ' + convert(varchar, @start_idx+@page_size) +
> '
> select @count = count(idx)
> from free_board
>'
>-- 커서 생성 및 시작 포인트 잡기
>set @sql = @sql + '
> declare board_cursor cursor local static read_only for
> select top '+convert(varchar, @start_idx+@page_size)+' idx
> from free_board
> where active_state = 1'+@search_str+' order by idx desc'
>
>-- 커서 실행 게시판 데이터로부터 받은 값을 임시테이블로 삽입
>set @sql = @sql + '
>
> if @count > 0
> begin
>
> open board_cursor
>
> fetch absolute @start_idx from board_cursor
> into @b_idx
>
> while @@fetch_status = 0 and @start_idx < @page_size
> begin
> set @start_idx = @start_idx + 1
> insert @boardtable
> select
>
> idx,
> id,
> name,
> aca_name,
> hit,
> praise,
> membertype,
> write_time,
> subject,
> contents,
> fname,
> ftype,
> fencodename,
> active_state
>
> from free_board
> where active_state = 1
> and idx= @b_idx
> fetch next from board_cursor
> into @b_idx
> end
>
> close board_cursor
>end
>deallocate board_cursor
>
> if @@error = 0
> begin
> select
>
> idx,
> id,
> name,
> aca_name,
> hit,
> praise,
> membertype,
> write_time,
> (case when len(subject) >'+ convert (varchar, @length) + ' then
> left (subject, ' +convert(varchar, @length ) + ') + ''...''
> else subject
> end) as subject,
> contents,
> fname,
> ftype,
> fencodename,
> active_state,
> get_comment_count(''free_board'', idx) as comment_count
> from @boardtable
> end
> '
>--print @sql
>exec (@sql)
>set nocount off
>go
>exec free_board_list
------------------------------------------------------------