pingpang

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  21 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

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

        存储过程的优点:

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

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

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

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

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

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

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

  1. <span style="font-size:24px;">CREATE PROCEDURE [dbo].[procCardByMore]</span>  
  2.     @cardNo varchar (50),  
  3.     @TeacherID varchar(50),   
  4.     @Name varchar(50),  
  5.     @telephone varchar(50)    
  6. AS   
  7. DECLARE @sql varchar(1000)   
  8. SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话 FROM view_CardDetail '  
  9.   
  10. IF(@cardNo <>'')   
  11. BEGIN   
  12. SET @sql=@sql+'and  cardNo ='''+@cardNo+''''  
  13. END  
  14.   
  15. IF(@TeacherID <>'')   
  16. BEGIN   
  17. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
  18. END  
  19.   
  20. IF(@Name <>'')   
  21. BEGIN   
  22. SET @sql=@sql+'and  Name ='''+@Name +''''  
  23. END  
  24.   
  25. IF(@Name <>'')   
  26. BEGIN   
  27. SET @sql=@sql+'and  telephone ='''+@telephone +''''  
  28. END  
  29.   
  30. exec(@sql)  

        这里面假如卡号不为空的话,那么写出来的sql语句是这样的:

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

  1. CREATE PROCEDURE [dbo].[procCardByMore]  
  2.     @cardNo varchar (50),  
  3.     @TeacherID varchar(50),   
  4.     @Name varchar(50),  
  5.     @telephone varchar(50)    
  6. AS   
  7. DECLARE @sql varchar(1000)   
  8. 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 '  
  9.   
  10. IF(@cardNo <>'')   
  11. BEGIN   
  12. SET @sql=@sql+'and  cardNo ='''+@cardNo+''''  
  13. END  
  14.   
  15. IF(@TeacherID <>'')   
  16. BEGIN   
  17. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
  18. END  
  19.   
  20. IF(@Name <>'')   
  21. BEGIN   
  22. SET @sql=@sql+'and  Name ='''+@Name +''''  
  23. END  
  24.   
  25. IF(@Name <>'')   
  26. BEGIN   
  27. SET @sql=@sql+'and  telephone ='''+@telephone +''''  
  28. END  
  29.   
  30. exec(@sql)  

        这样的话执行出来的结果是这样的:

  1. 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“的需求,但是它的存在却恰好解决了两者互不相容的尴尬局面。

        受上面的启发,下面的情况是这样解决的:

        需要根据教师编号和起始日期查询教师的消费记录情况,两个条件的存在情况各自随便。

        存储过程代码如下:

  1. CREATE PROCEDURE [dbo].[procConsumeByMore]   
  2.     @TeacherID varchar(50),   
  3.     @TimeStart datetime,   
  4.     @TimeEnd datetime   
  5. AS   
  6. DECLARE @sql varchar(1000)   
  7. 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 '  
  8.   
  9.   
  10. IF(@TeacherID <>'')   
  11. BEGIN   
  12. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
  13. END  
  14.   
  15. IF( @TimeStart<>null and @TimeEnd<>null)   
  16. BEGIN   
  17. SET @sql=@sql+'and  consumeTime between '''+@TimeStart +''' and '''+@TimeEnd+''''  
  18. END  
  19.   
  20. exec(@sql)  

        这里当@TimeStart和@TimeEnd为空的时候,空字符串不能转换成日期类型,这时候假如两个变量为空,我可以给他们赋一个完全的值:

  1. exec procConsumeByMore '', '1799-01-01','9999-12-29'  

               如上面的代码就可以选择出所有的消费记录了。

        上面两件事情中必然事件这个配角起了不可忽视的作用,然而必然事件却不是我们在查询过程中需要的条件。

        生活中配角并不意味着无趣和呆板,配角一样可以灵动,只是它把对别人的善意放在第一位,不把张扬作为表达自己的方式。‘上善若水,水善利万物而不争’,但是水又无处不在,其实就是这样一种状态。创造一个最好的配角,并不比创造一个主角容易。
posted on 2012-07-17 21:29 往事随风 阅读(688) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: