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