더북(TheBook)

8. 게시판의 글 답변 페이지인 BoardReply.aspx에서 사용할 저장 프로시저 구문을 다음과 같이 작성한다. 참고로 답변 기능에 대한 쿼리는 복잡한 로직이 적용되어 있다(이 책에서 제시한 쿼리 구문 말고도 더 많은 방법이 있으므로 답변형 게시판에 대한 로직을 많이 검색해보기 바란다).

▼  /dbo/Stored Procedures/DotNetNote/DNN_ReplyNote.sql

–[4] 게시판(DotNetNote)에 글을 답변 : ReplyNote
Create Proc dbo.ReplyNote
  @Name        NVarChar(25),
  @Email       NVarChar(100),
  @Title       NVarChar(150),
  @PostIp      NVarChar(15),
  @Content     NText,
  @Password    NVarChar(20),
  @Encoding    NVarChar(10),
  @Homepage    NVarChar(100),
  @ParentNum   Int,                 부모글의 고유번호(Id)
  @FileName    NVarChar(255),
  @FileSize    Int
As
  –[0] 변수 선언
  Declare @MaxRefOrder Int
  Declare @MaxRefAnswerNum Int
  Declare @ParentRef Int
  Declare @ParentStep Int
  Declare @ParentRefOrder Int
  
  –[1] 부모글의 답변수(AnswerNum)1증가
  Update Notes Set AnswerNum = AnswerNum + 1 Where Id = @ParentNum
  
  –[2] 같은 글에 대해서 답변을 두 번 이상하면 먼저 답변한 게 위에 나타나게 한다.
  Select @MaxRefOrder = RefOrder, @MaxRefAnswerNum = AnswerNum From Notes
  Where
      ParentNum = @ParentNum And
      RefOrder =
          (Select Max(RefOrder) From Notes Where ParentNum = @ParentNum)
  
  If @MaxRefOrder Is Null
  Begin
      Select @MaxRefOrder = RefOrder From Notes Where Id = @ParentNum
      Set @MaxRefAnswerNum = 0
  End
  
  –[3] 중간에 답변달 때(비집고 들어갈 자리 마련)
  Select
      @ParentRef = Ref, @ParentStep = Step
  From Notes Where Id = @ParentNum
  
  Update Notes
  Set
      RefOrder = RefOrder + 1
  Where
      Ref = @ParentRef And RefOrder > (@MaxRefOrder + @MaxRefAnswerNum)
  
  –[4] 최종저장
  Insert Notes
  (
      Name, Email, Title, PostIp, Content, Password, Encoding,
      Homepage, Ref, Step, RefOrder, ParentNum, FileName, FileSize
  )
  Values
  (
      @Name, @Email, @Title, @PostIp, @Content, @Password, @Encoding,
      @Homepage, @ParentRef, @ParentStep + 1,
      @MaxRefOrder + @MaxRefAnswerNum + 1, @ParentNum, @FileName, @FileSize
  )
Go

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.