제목 : 게시판 저장프로시저(SP) 목록 페이징처리한거 만드는건데요..
    
    
        
            
                | 글번호: |  | 439 | 
            
                | 작성자: |  | 서방원 | 
            
                | 작성일: |  | 2007/03/09 오전 1:56:00 | 
            
            
                | 조회수: |  | 5815 | 
            
        
     
 
    
	
	
    
	안녕하세요...제가 회사 수습으로 현재 교육을 받고 있는데 이번 과제였던 게시판 구현을위해 저장프로시저로 게시판 목록을 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