1
use
hrmis
2
set
ANSI_NULLS
ON
3
set
QUOTED_IDENTIFIER
ON
4
GO
5
Alter
Trigger
[
dbo
]
.
[
Tg_k20_month
]
on
[
dbo
]
.
[
k20
]
6
FOR
insert
,
update
7
AS
8
if
(
update
(k2006))
or
(
update
(k2007))
9
BEGIN
10
declare
@msg
nvarchar
(
80
),
@begTIme
datetime
,
@endTime
datetime
;
11
declare
@Year
int
,
@Month
int
;
12
--
获取请假的年份及月份
13
select
@Year
=
Year
(k2006),
14
@Month
=
Case
15
When
Day
(k2006)
>
25
Then
Month
(k2006)
+
1
16
else
Month
(k2006)
17
End
18
From
Inserted;
19
--
计算请假单据的开始时间所在的月份
20
Select
@endTime
=
Case
21
When
@Month
<
10
Then
Convert
(
varchar
(
4
),
@Year
)
+
'
0
'
+
Convert
(
varchar
(
1
),
@Month
)
+
'
25
'
22
else
Convert
(
datetime
,
Convert
(
varchar
(
4
),
@Year
)
+
Convert
(
varchar
(
1
),
@Month
)
+
'
25
'
)
23
End
24
--
,@begTime = Case
25
--
When @Month < 11 Then Convert(varchar(4),@Year)+'0'+Convert(varchar(1),@Month-1)+'26'
26
--
else Convert(varchar(4),@Year)+Convert(varchar(1),@Month-1)+'26'
27
--
End
28
if
exists
(
Select
A0188
From
Inserted
Where
k2007
>
@endTime
)
29
Begin
30
Select
@msg
=
Convert
(
varchar
(
5
),k2006,
110
)
+
'
到
'
+
Convert
(
varchar
(
5
),k2007,
110
)
+
31
'
此段时间内有跨月现象,请按月份重新录入!
'
from
Inserted
32
raiserror
(
@msg
,
16
,
1
)
33
rollback
transaction
34
return
35
End
36
End
37
return
有一个问题,是后来发现的,上面SQL语句中有一段:
1
if
exists
(
Select
A0188
From
Inserted
Where
k2007
>
@endTime
)
2
Begin
3
Select
@msg
=
Convert
(
varchar
(
5
),k2006,
110
)
+
'
到
'
+
Convert
(
varchar
(
5
),k2007,
110
)
+
4
'
此段时间内有跨月现象,请按月份重新录入!
'
from
Inserted
5
raiserror
(
@msg
,
16
,
1
)
6
rollback
transaction
7
return
8
End
其中raiserror(@msg,16,1)
是抛出一个错误级别为16的异常信息,这个信息能否被C#里的catch语句捕足?具体怎么捕捉?由于今天是在转我QQ空间的资料,所以暂时写一点,日后我看到的话,回来再补回。

