由存储过程谈“配角”

发表于:2012-7-18 09:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wangboxian    来源:51Testing软件测试网采编

  存储过程是一组预先编译好的sql语句。将他放在服务器上面,由用户通过指定存储过程的名字来执行它。

  存储过程的优点:

  封装——可用于操作数据库对象的方法,用户只需要知道它的输入输出参数并理解其目的即可。

  改善性能——已经预先编译

  减少网络流量——只返回最后的结果集

  重要性——针对复杂逻辑,应用已经测试号的存储过程,不容易发生错误。

  安全性——如果数据库拥有者DBO或者系统管理员SA编译并保存了存储结构,存储过程就有了对它使用的数据库对象的所有访问权限。因此系统管理员可以向单独的用于授予对数据对象的最小访问权限,而不是直接允许用户使用数据库对象。

  这次项目开发中运用了不少的存储过程,中间遇到了一个小问题,大家可以看看:

  事情是这样的:我想根据卡号、教师编号、教师姓名、联系电话这四个条件查询教师编号,这四个条件可以不存在,可以只存在一个,可以只存在两个,可以只存在三个,可以存在四个。开始我写的存储过程是这样的

<SPAN style="FONT-SIZE: 24px">CREATE PROCEDURE [dbo].[procCardByMore]</SPAN>
 @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

exec(@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。然而这个时候如果加上个必然条件那就完美了,接下来的存储过程创建语句是这样的:

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

exec(@sql)

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号