博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重构可让SQL提高可维护性,可读性以及效能性
阅读量:6837 次
发布时间:2019-06-26

本文共 4003 字,大约阅读时间需要 13 分钟。

重构,每天对Insus.NET来说,是必须的工作,不过一直是着重C#程序。昨晚在家中修改SQL一个小问题时,无意中看到一个触发器虽然它能正确运行,但值得重构它。

这个触发器功能是当用户预定会议室成功之后,系统会发送一封预定成功的确认函邮件。下面代码是原始触发器

ExpandedBlockStart.gif
tri_MeetingRoomBooking_BookingSuccessNotify
SET ANSI_NULLS 
ON
GO
SET QUOTED_IDENTIFIER 
ON
GO
--
 =============================================
--
 Author:        Insus.NET
--
 Create date:   2011-08-07
--
 Description:   Meeting Room Booking success notify
--
 =============================================
CREATE 
TRIGGER 
[
dbo
].
[
tri_MeetingRoomBooking_BookingSuccessNotify
]
ON 
[
dbo
].
[
MeetingRoomBooking
]
FOR 
INSERT
AS
BEGIN
    
SET NOCOUNT 
ON
    
DECLARE 
@MeetingRoomBookingId 
INT
@ContactEmail 
NVARCHAR(
150),
@CreateBy 
INT,
@ContentPagePath 
NVARCHAR(
1000)    
    
    
--
从INSERTED内存虚拟表给变量赋值    
    
SELECT 
@MeetingRoomBookingId 
= 
[
MeetingRoomBookingId
],
@ContactEmail 
= 
[
Email
],
@CreateBy 
= 
[
CreateBy
] 
FROM INSERTED
    
    
--
设定邮件Web地址
    
SET 
@ContentPagePath 
= N
'
http://www.yourcompany.com/MailNotify/BookingSuccess.aspx?ID=
' 
+ 
CONVERT(
NVARCHAR(
100),
@MeetingRoomBookingId)
    
    
--
从Users表中找到预定人的邮箱
    
DECLARE 
@CreaterEmail 
NVARCHAR(
200)
    
SELECT 
@CreaterEmail 
= 
[
Email
] 
FROM 
[
dbo
].
[
Users
] 
WHERE 
[
UsersId
] 
= 
@CreateBy        
    
    
--
判断预定人与会议联系人是否为同一个人,还是帮助别人预定,并把相关的信息插入邮件发送列表中。
    
IF (
@ContactEmail 
= 
@CreaterEmail)    
        
EXECUTE 
[
dbo
].
[
usp_MailingList_Insert
] 
@Email 
= 
@ContactEmail,
@Subject 
= N
'
会议室预定成功确认函
',
@HtmlPagePath 
= 
@ContentPagePath,
@EmailParameterId 
= 
2;
    
ELSE
    
BEGIN
        
EXECUTE 
[
dbo
].
[
usp_MailingList_Insert
] 
@Email 
= 
@ContactEmail,
@Subject 
= N
'
会议室预定成功确认函
',
@HtmlPagePath 
= 
@ContentPagePath,
@EmailParameterId 
= 
2;
        
EXECUTE 
[
dbo
].
[
usp_MailingList_Insert
] 
@Email 
= 
@CreaterEmail,
@Subject 
= N
'
会议室预定成功确认函
',
@HtmlPagePath 
= 
@ContentPagePath,
@EmailParameterId 
= 
2;
    
END
END

 

重构过程以一些想法,

变量@MeetingRoomBookingId宣告的数据类型由INT改为NVARCHAR(100),这样在设置邮件Web地址时,无需对CONVERT(NVARCHAR(100),@MeetingRoomBookingId)

转换了:......aspx?ID=' + @MeetingRoomBookingId

 

从Users表中找到预定人的邮箱,是先宣告变量,由于是使用SQL2008,可以在宣告变量之后,马上赋值: 

DECLARE 
@CreaterEmail 
NVARCHAR(
200
= (
SELECT 
[
Email
] 
FROM 
[
dbo
].
[
Users
] 
WHERE 
[
UsersId
] 
= 
@CreateBy)

 

邮件标题,可以重构放入一个变量之中,某一天需要更改它时,只改一次即可。

@Subject 
NVARCHAR(
50
= N
'
会议室预定成功确认函
'

 

接下是此次重构的重点是判断预定人与会议联系人是否为同一个人,还帮助别人预定,并把相关的信息插入邮件发送列表中。正常判断如原始代码写法一样,当同一个人时,直接发送给预定人就行了,如果不是同一个人,要把预定成功的邮件发送给预定人和会议联系人。

此次,Insus.NET使用了反方式判断,判断由相等,改为不相等,减少IF的层次和可以节省一代码以及提高可维护性:

IF (
@ContactEmail 
<> 
@CreaterEmail)    
    
EXECUTE 
[
dbo
].
[
usp_MailingList_Insert
] 
@Email 
= 
@CreaterEmail,
@Subject 
= 
@Subject,
@HtmlPagePath 
= 
@ContentPagePath,
@EmailParameterId 
= 
2;
        
EXECUTE 
[
dbo
].
[
usp_MailingList_Insert
] 
@Email 
= 
@ContactEmail,
@Subject 
= 
@Subject,
@HtmlPagePath 
= 
@ContentPagePath,
@EmailParameterId 
= 
2;

 

重构之后,完整代码:

ExpandedBlockStart.gif
tri_MeetingRoomBooking_BookingSuccessNotify
SET ANSI_NULLS 
ON
GO
SET QUOTED_IDENTIFIER 
ON
GO
--
 =============================================
--
 Author:        Insus.NET
--
 Create date:   2011-08-07
--
 Description:   Meeting Room Booking success notify
--
 =============================================
ALTER 
TRIGGER 
[
dbo
].
[
tri_MeetingRoomBooking_BookingSuccessNotify
]
ON 
[
dbo
].
[
MeetingRoomBooking
]
FOR 
INSERT
AS
BEGIN
    
SET NOCOUNT 
ON
    
DECLARE 
@MeetingRoomBookingId 
NVARCHAR(
100), 
@ContactEmail 
NVARCHAR(
150),
@Subject 
NVARCHAR(
50
= N
'
会议室预定成功确认函
',
@CreateBy 
INT,
@ContentPagePath 
NVARCHAR(
1000)    
    
    
--
从INSERTED内存虚拟表给变量赋值    
    
SELECT 
@MeetingRoomBookingId 
= 
[
MeetingRoomBookingId
],
@ContactEmail 
= 
[
Email
],
@CreateBy 
= 
[
CreateBy
] 
FROM INSERTED
    
    
--
设定邮件Web地址
    
SET 
@ContentPagePath 
= N
'
http://www.yourcompany.com/MailNotify/BookingSuccess.aspx?ID=
' 
+ 
@MeetingRoomBookingId
    
    
--
从Users表中找到预定人的邮箱
    
DECLARE 
@CreaterEmail 
NVARCHAR(
200
= (
SELECT 
[
Email
] 
FROM 
[
dbo
].
[
Users
] 
WHERE 
[
UsersId
] 
= 
@CreateBy)    
    
    
--
判断预定人与会议联系人是否为同一个人,还是帮助别人预定,并把相关的信息插入邮件发送列表中。    
    
IF (
@ContactEmail 
<> 
@CreaterEmail)    
        
EXECUTE 
[
dbo
].
[
usp_MailingList_Insert
] 
@Email 
= 
@CreaterEmail,
@Subject 
= 
@Subject,
@HtmlPagePath 
= 
@ContentPagePath,
@EmailParameterId 
= 
2;
        
    
EXECUTE 
[
dbo
].
[
usp_MailingList_Insert
] 
@Email 
= 
@ContactEmail,
@Subject 
= 
@Subject,
@HtmlPagePath 
= 
@ContentPagePath,
@EmailParameterId 
= 
2;
END

 

 

转载地址:http://whmkl.baihongyu.com/

你可能感兴趣的文章
第19课:Spark高级排序彻底解密
查看>>
深入剖析Android系统
查看>>
网络部署原理加实验步骤
查看>>
Google 公司的 Java 语言编写规范
查看>>
linux系统启动级别
查看>>
bash编程-循环控制的结构
查看>>
Java-第三章-使用if选择结构实现,如果年龄够7岁或5岁并且是男,可以搬桌子
查看>>
使用 /proc 文件系统来访问 Linux 内核的内容
查看>>
andriod之log打印
查看>>
我的友情链接
查看>>
Web应用中的缓存一致性问题
查看>>
通过Android重审GET和POST请求
查看>>
马王堆汉墓帛书‧老子甲本——道经
查看>>
ruby中DBI连接MySQL数据库步骤详解
查看>>
mongodb 的PHP 扩展
查看>>
bp神经网络
查看>>
彻底理解cookie,session,localStorage(附代码)
查看>>
你还记得当初为什么进入IT行业吗?
查看>>
[翻译]MongoDb 架构(MongoDb Architecture)
查看>>
oracle统计数据库所有表的数据记录数SQL
查看>>