引言
在上一篇博客中给大家介绍了触发器的作用,那么我在这篇博客中给大家介绍一下存储过程的知识,触发器和存储过程非常的相似,所以给大家介绍完存储过程以后会通过对比这两块知识给大家总结一下。
基本知识
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。大概分为三类:系统、本地、临时、远程、扩展存储过程几类。
作用
1、存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。
2、存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
3、存储过程主要是在服务器上运行,减少对客户机的压力。
4、存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。
实例
在机房收费系统中最让我们头疼的一个功能模块就是组合查询功能,在这个系统中有四个一样的窗体,其中的代码都是差不多的,都是根据不同的条件对不同的表进行查询操作,在第一遍的时候,我们就理由字符串的拼接完成一个后,就利用复制代码的手段来实现,这样就会出现大量的重复代码,在重构的时候再次遇到这个问题,不会在重复的复制代码,而是用到了模板方法(在介绍组合查询的时候详细介绍)和存储过程,下面给大家分享一下:
-- ============================================= -- Author: 郑浩 -- Create date: 2014-12-26 -- Description: 用于组合查询时和数据库交互 -- ============================================= ALTER PROCEDURE [dbo].[PROC_GroupCheck] -- Add the parameters for the stored procedure here @cobFieldName1 varchar(50), @cobOperator1 varchar(50), @txtContent1 varchar(50), @cobFieldName2 varchar(50), @cobOperator2 varchar(50), @txtContent2 varchar(50), @cobFieldName3 varchar(50), @cobOperator3 varchar(50), @txtContent3 varchar(50), @cobRelations1 varchar(50), @cobRelations2 varchar(50), @tableName varchar(50) AS declare @TempSql varchar(500)--临时存放sql语句 BEGIN SET @TempSql='SELECT * FROM '+@tableName +' WHERE ' +@cobFieldName1 +@cobOperator1+char(39) + @txtContent1 + char(39) --SET @TempSql='SELECT * FROM '+'ZH_StudentInfo' +' WHERE ' +@cobFieldName1 +@cobOperator1+char(39) + @txtContent1 + char(39) if (@cobRelations1 is not null) BEGIN SET @TempSql=@TempSql+@cobRelations1+CHAR(32)+@cobFieldName2 +@cobOperator2+CHAR(39)+@txtContent2+CHAR(39) if (@cobRelations2 is not null) BEGIN SET @TempSql=@TempSql+@cobRelations2+CHAR(32)+@cobFieldName3+@cobOperator3+CHAR(39)+@txtContent3+CHAR(39) END END EXECUTE(@TempSql) END
这样我们的D层就非常的轻松了,只负责调用这个存储过程和传入相应的参数就可以了,这样我们就可以传进来的参数对不同的表进行操作了。
触发器 VS 存储过程
相同点
两者都是较复杂的SQL语句集,简单的说触发器是特殊的存储过程,当我们在系统中需要对多个表进行同时操作的时候,我们就可以考虑用它们两个,这样是D层在实现复杂功能时压力能小点。
当然我们在使用的时候需要综合考虑一些问题,像代码的调试和维护,数据库的迁移(不同的数据库支持的触发器和存储过程的格式不同)等问题。
不同点
一、触发器不能用EXECUTE语句调用,当我们对数据库中的表进行Update、Delete、Add等操作激活自动执行的,而存储过程是我们通过存储器的名称直接调用的。
二、触发器是比较霸道的执行,只要我们满足了触发条件,用户是不能控制执行的。而触发器的执行是用户在代码中控制调用的,这样显得比较灵活一些。
小结
触发器和存储过程有着很强大的作用,当我们借助两者的时候我们可以再D层用简单的代码实现很复杂的功能,同时在很大程度上提高我们系统的效率,但是在使用的时候需要综合考虑,不能过度的使用两者。因为两者不单可以破换数据库的结构,给后期的代码调试和维护也增加了负担。所以,我们应该权衡利弊后在使用。