'게시판'에 해당되는 글 1건

  1. 2009.10.13 MSSQL 게시판... by 아르다

MSSQL 게시판...

MS-SQL : 2009.10.13 14:08

웹에 있어서 기본이 되는 게시판...

오랫만에 생각해 보니 참 햇갈린다...

 

그래서 정리해보기로 한다...

 

테이블 구조는 아주 간단한 답변형 게시판으로함.

 

/******************테이블 스크립트 **********************/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TB_BOARD_SAMBLE](
 [UID] [int] NOT NULL,
 [TITLE] [nvarchar](100) NOT NULL,
 [FID] [int] NOT NULL,
 [DEPTH] [nvarchar](10) NOT NULL,
 CONSTRAINT [PK_TB_BOARD_SAMBLE] PRIMARY KEY CLUSTERED 
(
 [UID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/*****************************************************/

간단히 설명하자면

UID :Unique ID로 테이블 식별자 역활을 한다. 자동증가 값으로 하고는 싶지만...

       데이터를 가져오는 부분때문에 그렇게 하지는 못한다...

TITLE : 게시판의 제목이 되겠지...

FID : 같은 그룹을 의미한다... Family ID의 약자

DEPTH: 답글인지.. 답글이면 몇번째 답글이지를 표현한다.

 

답변형 게시판의 가장 중요한 포인트는 아마도 FID와 Depth가 아닐까...하는 생각이 든다.

 

데이터를 넣어보자

 

입력 프로시져....

허접하더라도 개인적인 블로그니깐 딴지걸지는 말고... 수정 방향만 제시해 주었으면 함...

 

복잡한것 같지만 내용을 보면 그리고 주석을 빼면... 별 내용없는것 같다....

/********************************************************/


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*-- =============================================
exec USP_BOARD_SAMPLE_I 'test1'
exec USP_BOARD_SAMPLE_I 'test2', ''
exec USP_BOARD_SAMPLE_I 'test3', ''
exec USP_BOARD_SAMPLE_I 'test4', ''
exec USP_BOARD_SAMPLE_I 'test5', ''
exec USP_BOARD_SAMPLE_I 'test6', ''
exec USP_BOARD_SAMPLE_I 'test7', ''
exec USP_BOARD_SAMPLE_I 'test8', ''
exec USP_BOARD_SAMPLE_I 'test9', ''

exec USP_BOARD_SAMPLE_I 'test1_1', '1', 'A'
exec USP_BOARD_SAMPLE_I 'test1_2', '1', 'A'
exec USP_BOARD_SAMPLE_I 'test2_1', '2', 'A'
exec USP_BOARD_SAMPLE_I 'test2_2', '2', 'A'
exec USP_BOARD_SAMPLE_I 'test2_3', '2', 'A'

exec USP_BOARD_SAMPLE_I 'test1_2_1', '11', 'AB'
exec USP_BOARD_SAMPLE_I 'test1_2_2', '11', 'AB'
exec USP_BOARD_SAMPLE_I 'test1_1_1', '10', 'AA'
exec USP_BOARD_SAMPLE_I 'test1_2_3', '11', 'AB'

exec USP_BOARD_SAMPLE_I 'test1_2_1', '16', 'ABB'
exec USP_BOARD_SAMPLE_I 'test1_2_2', '16', 'ABB'
exec USP_BOARD_SAMPLE_I 'test1_2_3', '16', 'ABB'
exec USP_BOARD_SAMPLE_I 'test1_2_4', '16', 'ABB'
exec USP_BOARD_SAMPLE_I 'test1_2_5', '16', 'ABB'


exec USP_BOARD_SAMPLE_I 'test1_1_2', '10', 'AA'

SELECT ASCII('A'), CHAR(1)

  select max(DEPTH) FROM .[dbo].[TB_BOARD_SAMBLE]
  where fid = (select fid FROM .[dbo].[TB_BOARD_SAMBLE] where UID=45)
  AND   len(DEPTH) = (select len(DEPTH)+1 FROM .[dbo].[TB_BOARD_SAMBLE] where UID=45)

 

   select max(DEPTH) FROM .[dbo].[TB_BOARD_SAMBLE]
   where  fid = (select fid FROM .[dbo].[TB_BOARD_SAMBLE] where UID=4)
   and len(DEPTH) = len('')+1
-- =============================================*/
ALTER PROCEDURE USP_BOARD_SAMPLE_I
 @TITLE nvarchar(100),
 @UID NVARCHAR(10) = null,
 @DEPTH NVARCHAR(10) = null
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;
 
 IF @UID is null or LEN(@UID) = 0
 BEGIN

  --응답글이 아닐경우....

  INSERT INTO .[dbo].[TB_BOARD_SAMBLE]
      ([UID]
      ,[TITLE]
      ,[FID]
      ,[DEPTH])
   VALUES
      (
      (select isnull(max(uid)+1, 1) FROM .[dbo].[TB_BOARD_SAMBLE])
      ,@TITLE
      ,(select isnull(max(fid)+1, 1) FROM .[dbo].[TB_BOARD_SAMBLE])
      ,CHAR(65)
      );
 END
 ELSE
 BEGIN

  --응답글일 경우...
  DECLARE @MakeDepth NVARCHAR(10);
  
  IF @DEPTH is null     --이런 경우는 없겠지만 그냥 써놔준다... 
  BEGIN
   SET @MakeDepth = 'A';
  END
  ELSE
  BEGIN
   select @MakeDepth=isnull(left(max(DEPTH), len(max(DEPTH))-1)+CHAR(ASCII(right(max(DEPTH), 1))+1),
          @DEPTH+CHAR(65)) 
   FROM .[dbo].[TB_BOARD_SAMBLE]
   where fid =(select fid FROM .[dbo].[TB_BOARD_SAMBLE] where UID=@UID)
   AND   len(DEPTH) = len(@DEPTH)+1 AND DEPTH like @DEPTH+'%'
  END
  INSERT INTO .[dbo].[TB_BOARD_SAMBLE]
      ([UID]
      ,[TITLE]
      ,[FID]
      ,[DEPTH])
   VALUES
      (
         (select isnull(max(uid)+1, 1) FROM .[dbo].[TB_BOARD_SAMBLE])
      ,@TITLE
      ,(select fid FROM .[dbo].[TB_BOARD_SAMBLE] where UID=@UID)
      ,@MakeDepth
      );

 END

END
GO
/***************************************************************/

그럼 입력 했으니깐.. 불러와야지....

/*****************************************************/

USE [Ambassador_CCM]
GO
/****** Object:  StoredProcedure [dbo].[USP_BOARD_SAMPLE_S]    Script Date: 07/01/2009 18:28:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*-- =============================================
-- Author:  
-- Create date: 
-- Description: 
exec USP_BOARD_SAMPLE_S 1
exec USP_BOARD_SAMPLE_S 2
-- =============================================*/
ALTER PROCEDURE [dbo].[USP_BOARD_SAMPLE_S]
 @PAGE int = 1,
 @SIZE int = 10
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

 
    select IDENTITY(int,0,1) AS RowNum,
   UID, 
   case len(DEPTH) when 1 then '' else 'RE)' end + REPLICATE(' ', (LEN(DEPTH)-1)*2) + TITLE as TITLE
   into #TEMP_BOARD 
 from dbo.TB_BOARD_SAMBLE
 order by FID, DEPTH;
 
 select * from #TEMP_BOARD
 where RowNum between (@PAGE-1)* @SIZE and (@PAGE)* @SIZE -1;
END
/*****************************************************/

흠... 대략적인건 이렇게 하면 되지 않을까...^^


저작자 표시 비영리 동일 조건 변경 허락
신고

'MS-SQL' 카테고리의 다른 글

MSSQL2005 포트변경 하기  (2) 2010.03.30
MSSQL 게시판...  (0) 2009.10.13
MS-SQL에 저장된 마지막 번호 알아오기  (0) 2009.09.01
MSSQL 페이징 Query  (0) 2009.08.08
Posted by 아르다

댓글을 달아 주세요

티스토리 툴바