由存储过程谈“配角”
存储过程是一组预先编译好的sql语句。将他放在服务器上面,由用户通过指定存储过程的名字来执行它。
存储过程的优点:
封装——可用于操作数据库对象的方法,用户只需要知道它的输入输出参数并理解其目的即可。
改善性能——已经预先编译
减少网络流量——只返回最后的结果集
重要性——针对复杂逻辑,应用已经测试号的存储过程,不容易发生错误。
安全性——如果数据库拥有者DBO或者系统管理员SA编译并保存了存储结构,存储过程就有了对它使用的数据库对象的所有访问权限。因此系统管理员可以向单独的用于授予对数据对象的最小访问权限,而不是直接允许用户使用数据库对象。
这次项目开发中运用了不少的存储过程,中间遇到了一个小问题,大家可以看看:
事情是这样的:我想根据卡号、教师编号、教师姓名、联系电话这四个条件查询教师编号,这四个条件可以不存在,可以只存在一个,可以只存在两个,可以只存在三个,可以存在四个。开始我写的存储过程是这样的
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+''''ENDIF(@TeacherID <>'') BEGIN SET @sql=@sql+'and TeacherID ='''+@TeacherID+''''ENDIF(@Name <>'') BEGIN SET @sql=@sql+'and Name ='''+@Name +''''ENDIF(@Name <>'') BEGIN SET @sql=@sql+'and telephone ='''+@telephone +''''ENDexec(@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“的需求,但是它的存在却恰好解决了两者互不相容的尴尬局面。
受上面的启发,下面的情况是这样解决的:
需要根据教师编号和起始日期查询教师的消费记录情况,两个条件的存在情况各自随便。
存储过程代码如下:
exec procConsumeByMore '', '1799-01-01','9999-12-29'
如上面的代码就可以选择出所有的消费记录了。
上面两件事情中必然事件这个配角起了不可忽视的作用,然而必然事件却不是我们在查询过程中需要的条件。
生活中配角并不意味着无趣和呆板,配角一样可以灵动,只是它把对别人的善意放在第一位,不把张扬作为表达自己的方式。‘上善若水,水善利万物而不争’,但是水又无处不在,其实就是这样一种状态。创造一个最好的配角,并不比创造一个主角容易。- 32楼hejingyuan639分钟前
- 太厉害了,加油
- 31楼a1371510624小时前
- 顶
- 30楼liushuijinger4小时前
- 顶
- 29楼dsmmxq5小时前
- 太好了
- 28楼liutengteng1306小时前
- [e01]
- 27楼lidaasky6小时前
- 不错,层层递进
- 26楼lilongsheng1125昨天 22:38
- 高手…………
- 25楼beijiguangyong昨天 20:50
- 用"1=1"会严重影响效率~n[code=sql]nDECLARE @sql varchar(1000) nSET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话 FROM view_CardDetail 'nIF(@cardNo <>'')nbeginnif(charindex('where',@sql)>0)ntSET @sql=@sql+'and cardNo ='''+@cardNo+''''nelsentSET @sql=@sql+'where cardNo ='''+@cardNo+''''nENDn............n[/code]
- Re: wangboxian昨天 21:04
- 回复beijiguangyongn嗯,学习了
- 24楼liuyanlinglanq昨天 20:35
- 收藏
- 23楼llhhyy1989昨天 20:25
- 顶,独到的一面
- 22楼Alexandria_2昨天 20:24
- 要好好发挥配角的作用
- 21楼smszhuang168昨天 19:28
- 支持一下,好好学
- Re: wangboxian昨天 20:18
- 回复smszhuang168n嗯 ,嗯
- 20楼jyhye昨天 19:27
- 顶~~我去,可找到源码了,愁死我了
- 19楼lishehe昨天 19:23
- 顶,仙姐,哈哈[e04]
- 18楼haiyan_cf昨天 19:23
- 学习了,顶!
- 17楼lbq613613昨天 19:05
- 学习的过程,很强大!
- 16楼zhuojiajin昨天 19:04
- 果然是好文章,虽然对技术比较朦胧,但对你要表到的意思大概应该,我懂!呵呵
- 15楼qiulongtianshi昨天 18:52
- 博客写的太高深了,看完以后一点晕!原来是自己喝多了...呵呵...
- Re: qiulongtianshi昨天 18:54
- 回复qiulongtianshin喝多了:水,别瞎想,呵呵
- Re: wangboxian昨天 18:59
- 回复qiulongtianshin那就多吃点儿饭吧,啊
- 14楼xqf309昨天 18:41
- 技术高深[e04]
- 13楼yuluows昨天 17:28
- 支持
- 12楼mazhaojuan昨天 17:27
- 来过,不错,顶……
- 11楼zwk626542417昨天 17:09
- 果然是仙姐啊···
- 10楼yuyunli1989昨天 16:59
- 不错!支持一下!
- 9楼zs15932616453昨天 16:55
- 顶一个!
- 8楼a137151062昨天 16:55
- 顶
- 7楼sunliduan昨天 16:50
- 上善若水,水善利万物而不争。。。
- 6楼zhanglianhai555昨天 16:50
- 顶!
- 5楼happy09li昨天 16:46
- 没有配角就没有主角了,,n配角和主角是相对的
- 4楼ghevinn昨天 16:46
- 潜力股绝对滴,,
- 3楼liujiahan629629昨天 16:45
- 厉害!
- 2楼lmdcszh昨天 16:45
- 上善若水.水善利万物而不争!
- 1楼JUNE_916昨天 16:41
- 太高深啦。。。。。