微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【机房重构】——存储过程和触发器

引言

上一篇博客中给大家介绍了触发器的作用,那么我在这博客中给大家介绍一下存储过程的知识,触发器和存储过程非常的相似,所以给大家介绍完存储过程以后会通过对比这两块知识给大家总结一下。

基本知识

存储过程(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层用简单的代码实现很复杂的功能,同时在很大程度上提高我们系统的效率,但是在使用的时候需要综合考虑,不能过度的使用两者。因为两者不单可以破换数据库的结构,给后期的代码调试和维护也增加了负担。所以,我们应该权衡利弊后在使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr