1
--------------------------------------
2
---답변형 게시판 응용 프로그램
3
--------------------------------------
4
5
--[0] 답변형 게시판(Reply)용 테이블 설계
6
Create 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
)
26
Go
27
28
--[1]~[6] 기본 SQL문 4가지 작성
29
Select * From Reply
30
Go
31
32
--[7] 답변 게시판(Reply)에 글을 작성하는 저장 프로시저 : WriteReply
33
Create 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)
42
As
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
74
Go
75
76
--[8] 답변 게시판(Reply)에서 데이터를 읽어오는 저장 프로시저 : ListReply
77
--Drop Proc dbo.ListReply
78
Create Procedure dbo.ListReply
79
As
80
Select * From Reply Order By Ref Desc, RefOrder Asc
81
Go
82
83
--[9] 해당 글을 세부적으로 읽어오는 저장 프로시저 : ViewReply
84
Create Procedure dbo.ViewReply
85
@Num Int
86
As
87
Update Reply Set ReadCount = ReadCount + 1
88
Where Num = @Num
89
90
Select * From Reply Where Num = @Num
91
Go
92
93
--[10] 해당 글에 대한 비밀번호 읽어오는 저장 프로시저 : ReadPassword
94
Create Proc dbo.ReadPasswordReply
95
@Num Int
96
As
97
Select Password From Reply Where Num = @Num
98
Go
99
100
--[11] 해당 글 지우는 저장 프로시저 : procDeleteReply
101
Create Proc dbo.DeleteReply
102
@Num Int
103
As
104
Delete Reply Where Num = @Num
105
Go
106
107
--[12] 해당 글을 수정하는 저장 프로시저 : ModifyeReply
108
Create 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
118
As
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
130
Go
131
132
--[13] 답변 게시판(Reply)에 글을 답변하는 저장 프로시저 : ReplyReply
133
--Drop Proc dbo.ReplyReply
134
Create 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
144
As
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
172
Go
173
--테스트URL : http://sample.redplus.net/Web/Reply/List.aspx
174
--작성자 : 박용준(RedPlus)
175
176
177
178
179
180
--[0] 답변형 게시판 쿼리문 연습
181
--Drop Table dbo.ReplyTest
182
Create 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
)
191
Go
192
--[1] 처음으로 게시판 글쓰기
193
Insert Into ReplyTest(Title, Ref) Values('첫번째 부모글', 1)
194
195
--[2] 새로운 글 입력 : Write.aspx.cs
196
Begin
197
Declare @MaxRef Int
198
Select @MaxRef = Max(Ref) From ReplyTest
199
200
Insert Into ReplyTest(Title, Ref)
201
Values('두번째 부모글', @MaxRef + 1)
202
End
203
204
--[!] 출력
205
Select * From ReplyTest Order By Ref Desc, RefOrder Asc
206
207
--[3] 첫번째 부모글에 한단계 답변
208
Insert ReplyTest(Title, Ref, Step, RefOrder)
209
Values('>>첫번째 부모글에 답변', 1, 0+1, 0+1)
210
211
--[4] 첫번째 부모글에 답변의 답변 : [3]번글의 답변
212
Insert ReplyTest(Title, Ref, Step, RefOrder)
213
Values('>>>>첫번째 부모글에 답변의 답변', 1, 2, 2)
214
215
--[5] 두번째 부모글에 답변 : [2]번글의 답변
216
Insert ReplyTest(Title, Ref, Step, RefOrder)
217
Values('>>두번째 부모글에 답변', 2, 1, 1)
218
219
--[!] 출력
220
Select * From ReplyTest Order By Ref Desc, RefOrder Asc
221
222
--[6] 첫번째 부모글에 한단계 답변(나중에) : [1]번 글에 답변
223
Update ReplyTest Set RefOrder = RefOrder + 1
224
Where Ref = 1 And RefOrder > 0 -- 부모글의 RefOrder(0)보다 큰 레코드 모드 업데이트
225
Insert ReplyTest(Title, Ref, Step, RefOrder)
226
Values('>>첫번째 부모글에 답변(나중에)', 1, 0+1, 0+1)
227
228
--[7] [6]번 레코드에 답변
229
Update ReplyTest Set RefOrder = RefOrder + 1
230
Where Ref = 1 And RefOrder > 1 -- 부모글의 RefOrder(0)보다 큰 레코드 모드 업데이트
231
Insert ReplyTest(Title, Ref, Step, RefOrder)
232
Values('>>>>첫번째 부모글에 답변(나중에)의 답변', 1, 1+1, 1+1)
233
234
--[!] 데이터 출력
235
Select * From ReplyTest Order By Ref Desc, RefOrder Asc
236
237
-- 저장 프로시저화
238
--[1] 입력 저장 프로시저 : ReplyTestWrite.aspx
239
Create Procedure dbo.WriteReplyTest
240
@Title VarChar(150)
241
As
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
257
Go
258
--WriteReplyTest '첫번째 부모글'
259
--WriteReplyTest '두번째 부모글'
260
261
--[2] 출력 저장 프로시저 : ReplyTestList.aspx
262
Create Proc dbo.ListReplyTest
263
As
264
Select * From ReplyTest
265
Order By Ref Desc, RefOrder Asc
266
Go
267
268
--ListReplyTest
269
--[3] 답변 저장 프로시저
270
--Drop Proc dbo.ReplyReplyTest
271
Create Proc dbo.ReplyReplyTest
272
@Title VarChar(150),
273
@ParentRef Int, -- 부모글의 Ref
274
@ParentStep Int, -- 부모글의 Step
275
@ParentRefOrder Int -- 부모글의 RefOrder
276
As
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
292
Go
293