设为首页 加入收藏

TOP

由存储过程谈“配角”(一)
2014-11-24 01:08:17 来源: 作者: 【 】 浏览:16
Tags:存储 过程 配角
存储过程是一组预先编译好的sql语句。将他放在服务器上面,由用户通过指定存储过程的名字来执行它。
存储过程的优点:
封装——可用于操作 数据库对象的方法,用户只需要知道它的输入输出参数并理解其目的即可。 www.2cto.com
改善性能——已经预先编译
减少网络流量——只返回最后的结果集
重要性——针对复杂逻辑,应用已经测试号的存储过程,不容易发生错误。
安全性——如果数据库拥有者DBO或者 系统管理员SA编译并保存了存储结构,存储过程就有了对它使用的数据库对象的所有访问权限。因此系统管理员可以向单独的用于授予对数据对象的最小访问权限,而不是直接允许用户使用数据库对象。
这次项目开发中运用了不少的存储过程,中间遇到了一个小问题,大家可以看看:
事情是这样的:我想根据卡号、教师编号、教师姓名、联系电话这四个条件查询教师编号,这四个条件可以不存在,可以只存在一个,可以只存在两个,可以只存在三个,可以存在四个。开始我写的存储过程是这样的
[sql]
CREATE PROCEDURE [dbo].[procCardByMore]
@cardNo varchar (50),
@TeacherID varchar(50),
@Name varchar(50),
@telephone varchar(50)
AS
DECLARE @sql varchar(1000)
SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话 FROM view_CardDetail '
IF(@cardNo <>'')
BEGIN
SET @sql=@sql+'and cardNo ='''+@cardNo+''''
END
IF(@TeacherID <>'')
BEGIN
SET @sql=@sql+'and TeacherID ='''+@TeacherID+''''
END
IF(@Name <>'')
BEGIN
SET @sql=@sql+'and Name ='''+@Name +''''
END
IF(@Name <>'')
BEGIN
SET @sql=@sql+'and telephone ='''+@telephone +''''
END
www.2cto.com
exec(@sql)
这里面假如卡号不为空的话,那么写出来的sql语句是这样的:
[sql]
SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话FROM view_CardDetail and cardNo ='@cardNo’
这句话显然是错误的,在查询语句和条件的过渡的地方没有where,而是突然来了个and。然而这个时候如果加上个必然条件那就完美了,接下来的存储过程创建语句是这样的:
[sql]
CREATE PROCEDURE [dbo].[procCardByMore]
@cardNo varchar (50),
@TeacherID varchar(50),
@Name varchar(50),
@telephone varchar(50)
AS
DECLARE @sql varchar(1000)
SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话FROM view_CardDetail WHERE 1=1 '
IF(@cardNo <>'')
BEGIN
SET @sql=@sql+'and cardNo ='''+@cardNo+''''
END
IF(@TeacherID <>'')
BEGIN
SET @sql=@sql+'and TeacherID ='''+@TeacherID+''''
END
IF(@Name <>'')
BEGIN
SET @sql=@sql+'and Name ='''+@Name +''''
END
IF(@Name <>'')
BEGIN
SET @sql=@sql+'and telephone ='''+@telephone +''''
END www.2cto.com
exec(@sql)
这样的话执行出来的结果是这样的:
[sql]
SELECT TeacherID as 教师编号,Nameas 教师姓名,GradeName as 所属年级,cardNo as 卡号,cashas 卡内余额,realName as 管理员,OpenTime as 开卡时间,stateas 状态,telephone as 联系电话FROM view_CardDetail WHERE 1=1and cardNo ='+@cardNo+'
必然条件在这里充当了桥梁的作用,虽然我们没有“1=1“的需求,但是它的存在却恰好解决了两者互不相容的尴尬局面。
受上面的启发,下面的情况是这样解决的:
需要根据教师编号和起始日期查询教师的消费记录情况,两个条件的存在情况各自随便。
存储过程代码如下:
[sql]
CREATE PROCEDURE [dbo].[procConsumeByMore]
@TeacherID varchar(50),
@TimeStart datetime,
@TimeEnd datetime
AS
DECLARE @sql varchar(1000)
SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,orderID as 订单编号,adultNum as 成人数量,childNum as 儿童数量,consumeCash as 消费金额,consumeTime as 消费时间,userID as 管理员编号,realName as 管理员姓名FROM view_consumeDetail WHERE 1=1 '
IF(@TeacherID <>'')
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇截取日期参数中的月和日 下一篇数据库正规化和设计技巧(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: