1--------------------------------------
2---답변형 게시판 응용 프로그램
3--------------------------------------
4
5--[0] 답변형 게시판(Reply)용 테이블 설계
6Create Table dbo.Reply
7(
8 Num Int Identity(1, 1) Not Null Primary Key, --번호
9 Name VarChar(25) Not Null, --이름
10 Email VarChar(100) Null, --이메일
11 Title VarChar(150) Not Null, --제목
12 PostDate DateTime Default GetDate() Not Null, --작성일
13 PostIP VarChar(15) Not Null, --작성IP
14 Content Text Not Null, --내용
15 Password VarChar(20) Not Null, --비밀번호
16 ReadCount Int Default 0, --조회수
17 Encoding VarChar(10) Not Null, --인코딩(HTML/Text)
18 Homepage VarChar(100) Null, --홈페이지
19 ModifyDate DateTime Null, --수정일
20 ModifyIP VarChar(15) Null, --수정IP
21 ----------
22 Ref Int Not Null, --참조(부모글)
23 Step Int Default 0, --답변깊이(레벨)
24 RefOrder Int Default 0 --답변순서
25)
26Go
27
28--[1]~[6] 기본 SQL문 4가지 작성
29Select * From Reply
30Go
31
32--[7] 답변 게시판(Reply)에 글을 작성하는 저장 프로시저 : WriteReply
33Create Proc dbo.WriteReply
34 @Name VarChar(25),
35 @Email VarChar(100),
36 @Title VarChar(150),
37 @PostIP VarChar(15),
38 @Content Text,
39 @Password VarChar(20),
40 @Encoding VarChar(10),
41 @Homepage VarChar(100)
42As
43 -- 현재까지 테이블의 최대 Ref(참조) 값을 구해서,
44 -- 그 값이 0보다 크다면, 해당 Ref + 1로 데이터 저장
45 -- Ref는 부모글의 Num 필드와는 다르다.
46 Declare @MaxRef Int
47 Select @MaxRef = Max(Ref) From Reply
48 If @MaxRef > 0
49 Begin
50 Insert Reply
51 (
52 Name, Email, Title, PostIP, Content,
53 Password, Encoding, Homepage, Ref
54 )
55 Values
56 (
57 @Name, @Email, @Title, @PostIP, @Content,
58 @Password, @Encoding, @Homepage, @MaxRef + 1
59 )
60 End
61 Else
62 Begin
63 Insert Reply
64 (
65 Name, Email, Title, PostIP, Content,
66 Password, Encoding, Homepage, Ref
67 )
68 Values
69 (
70 @Name, @Email, @Title, @PostIP, @Content,
71 @Password, @Encoding, @Homepage, 1
72 )
73 End
74Go
75
76--[8] 답변 게시판(Reply)에서 데이터를 읽어오는 저장 프로시저 : ListReply
77--Drop Proc dbo.ListReply
78Create Procedure dbo.ListReply
79As
80 Select * From Reply Order By Ref Desc, RefOrder Asc
81Go
82
83--[9] 해당 글을 세부적으로 읽어오는 저장 프로시저 : ViewReply
84Create Procedure dbo.ViewReply
85 @Num Int
86As
87 Update Reply Set ReadCount = ReadCount + 1
88 Where Num = @Num
89
90 Select * From Reply Where Num = @Num
91Go
92
93--[10] 해당 글에 대한 비밀번호 읽어오는 저장 프로시저 : ReadPassword
94Create Proc dbo.ReadPasswordReply
95 @Num Int
96As
97 Select Password From Reply Where Num = @Num
98Go
99
100--[11] 해당 글 지우는 저장 프로시저 : procDeleteReply
101Create Proc dbo.DeleteReply
102 @Num Int
103As
104 Delete Reply Where Num = @Num
105Go
106
107--[12] 해당 글을 수정하는 저장 프로시저 : ModifyeReply
108Create Proc dbo.ModifyeReply
109 @Name VarChar(25),
110 @Email VarChar(100),
111 @Title VarChar(150),
112 @ModifyIP VarChar(15),
113 @ModifyDate DateTime,
114 @Content Text,
115 @Encoding VarChar(10),
116 @Homepage VarChar(100),
117 @Num Int
118As
119 Update Reply
120 Set
121 Name = @Name,
122 Email = @Email,
123 Title = @Title,
124 ModifyIP = @ModifyIP,
125 ModifyDate = @ModifyDate,
126 Content = @Content,
127 Encoding = @Encoding,
128 Homepage = @Homepage
129 Where Num = @Num
130Go
131
132--[13] 답변 게시판(Reply)에 글을 답변하는 저장 프로시저 : ReplyReply
133--Drop Proc dbo.ReplyReply
134Create Proc dbo.ReplyReply
135 @Name VarChar(25),
136 @Email VarChar(100),
137 @Title VarChar(150),
138 @PostIP VarChar(15),
139 @Content Text,
140 @Password VarChar(20),
141 @Encoding VarChar(10),
142 @Homepage VarChar(100),
143 @ParentNum Int -- 부모글의 번호 View.aspx?Num=5 이면, 5가 ParentNum
144As
145 -- 부모글의 번호를 기준으로 Ref/Step/RefOrder 가져오기
146 Declare @Ref Int
147 Declare @Step Int
148 Declare @RefOrder Int
149 Select @Ref = Ref, @Step = Step, @RefOrder = RefOrder
150 From Reply
151 Where Num = @ParentNum
152
153 Begin Tran
154 Update Reply
155 Set RefOrder = RefOrder + 1
156 Where
157 Ref = @Ref
158 And
159 RefOrder > @RefOrder
160
161 Insert Reply
162 (
163 Name, Email, Title, PostIP, Content, Password,
164 Encoding, Homepage, Ref, Step, RefOrder
165 )
166 Values
167 (
168 @Name, @Email, @Title, @PostIP, @Content, @Password,
169 @Encoding, @Homepage, @Ref, @Step + 1, @RefOrder + 1
170 )
171 Commit Tran
172Go
173--테스트URL : http://sample.redplus.net/Web/Reply/List.aspx
174--작성자 : 박용준(RedPlus)
175
176
177
178
179
180--[0] 답변형 게시판 쿼리문 연습
181--Drop Table dbo.ReplyTest
182Create Table dbo.ReplyTest
183(
184 Num Int Identity(1, 1) Primary Key Not Null, -- 번호
185 Title VarChar(150) Not Null, -- 제목
186 -- ...
187 Ref Int Default 0, --참조글(부모글;최상위글;답변이아닌글;그룹번호;Group)
188 Step Int Default 0, --들여쓰기(한단계 답변:한단계들여쓰기;Level;Depth)
189 RefOrder Int Default 0 --같은 그룹내에서의 정렬순서(Position)
190)
191Go
192--[1] 처음으로 게시판 글쓰기
193Insert Into ReplyTest(Title, Ref) Values('첫번째 부모글', 1)
194
195--[2] 새로운 글 입력 : Write.aspx.cs
196Begin
197 Declare @MaxRef Int
198 Select @MaxRef = Max(Ref) From ReplyTest
199
200 Insert Into ReplyTest(Title, Ref)
201 Values('두번째 부모글', @MaxRef + 1)
202End
203
204--[!] 출력
205Select * From ReplyTest Order By Ref Desc, RefOrder Asc
206
207--[3] 첫번째 부모글에 한단계 답변
208Insert ReplyTest(Title, Ref, Step, RefOrder)
209Values('>>첫번째 부모글에 답변', 1, 0+1, 0+1)
210
211--[4] 첫번째 부모글에 답변의 답변 : [3]번글의 답변
212Insert ReplyTest(Title, Ref, Step, RefOrder)
213Values('>>>>첫번째 부모글에 답변의 답변', 1, 2, 2)
214
215--[5] 두번째 부모글에 답변 : [2]번글의 답변
216Insert ReplyTest(Title, Ref, Step, RefOrder)
217Values('>>두번째 부모글에 답변', 2, 1, 1)
218
219--[!] 출력
220Select * From ReplyTest Order By Ref Desc, RefOrder Asc
221
222--[6] 첫번째 부모글에 한단계 답변(나중에) : [1]번 글에 답변
223Update ReplyTest Set RefOrder = RefOrder + 1
224Where Ref = 1 And RefOrder > 0 -- 부모글의 RefOrder(0)보다 큰 레코드 모드 업데이트
225Insert ReplyTest(Title, Ref, Step, RefOrder)
226Values('>>첫번째 부모글에 답변(나중에)', 1, 0+1, 0+1)
227
228--[7] [6]번 레코드에 답변
229Update ReplyTest Set RefOrder = RefOrder + 1
230Where Ref = 1 And RefOrder > 1 -- 부모글의 RefOrder(0)보다 큰 레코드 모드 업데이트
231Insert ReplyTest(Title, Ref, Step, RefOrder)
232Values('>>>>첫번째 부모글에 답변(나중에)의 답변', 1, 1+1, 1+1)
233
234--[!] 데이터 출력
235Select * From ReplyTest Order By Ref Desc, RefOrder Asc
236
237-- 저장 프로시저화
238--[1] 입력 저장 프로시저 : ReplyTestWrite.aspx
239Create Procedure dbo.WriteReplyTest
240 @Title VarChar(150)
241As
242 -- 현재까지 테이블의 최대 Ref(참조) 값을 구해서,
243 -- 그 값이 0보다 크다면, 해당 Ref + 1로 데이터 저장
244 -- Ref는 부모글의 Num 필드와는 다르다.
245 Declare @MaxRef Int
246 Select @MaxRef = Max(Ref) From ReplyTest
247 If @MaxRef > 0
248 Begin
249 Insert Into ReplyTest(Title, Ref)
250 Values(@Title, @MaxRef + 1) -- MaxRef+1로 저장
251 End
252 Else
253 Begin
254 Insert Into ReplyTest(Title, Ref)
255 Values(@Title, 1) -- 첫번째 레코드는 Ref를 1로 저장
256 End
257Go
258--WriteReplyTest '첫번째 부모글'
259--WriteReplyTest '두번째 부모글'
260
261--[2] 출력 저장 프로시저 : ReplyTestList.aspx
262Create Proc dbo.ListReplyTest
263As
264 Select * From ReplyTest
265 Order By Ref Desc, RefOrder Asc
266Go
267
268--ListReplyTest
269--[3] 답변 저장 프로시저
270--Drop Proc dbo.ReplyReplyTest
271Create Proc dbo.ReplyReplyTest
272 @Title VarChar(150),
273 @ParentRef Int, -- 부모글의 Ref
274 @ParentStep Int, -- 부모글의 Step
275 @ParentRefOrder Int -- 부모글의 RefOrder
276As
277 Begin Tran
278 --[A] Ref가 같고, RefOrder가 부모글보다 큰 모든 답변글들의
279 -- RefOrder값을 1증가
280 Update ReplyTest
281 Set RefOrder = RefOrder + 1
282 Where
283 Ref = @ParentRef
284 And
285 RefOrder > @ParentRefOrder
286 --[B] Ref는 부모글의 Ref를 그대로 저장
287 -- Step은 부모글의 Step + 1로 저장
288 -- RefOrder는 부모글의 RefOrder + 1로 저장([A]에서 업데이트 후)
289 Insert ReplyTest(Title, Ref, Step, RefOrder)
290 Values(@Title, @ParentRef, @ParentStep+1, @ParentRefOrder + 1)
291 Commit Tran
292Go
293