五.SQLserver数据库规范-存储过程

一 、概述

SQL Server中的存储过程是使用T_SQL编写的代码段。它的目的在于能够方便的从系统表中查询信息,或者完成与更新数据库表相关的管理任务和其他的系统管理任务.T_SQL语句是SQL Server数据库与应用程序之间的编程接口。在很多情况下,一些代码会被开发者重复编写多次,如果每次都编写相同功能的代码,不但繁琐,而且容易出错,而且由于SQL Server逐条的执行语句会降低系统的运行效率。

简而言之,存储过程就是SQL Server为了实现特定任务,而将一些需要多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上,有数据库服务器通过程序来调用。

1.1存储过程的优点:

存储过程加快系统运行速度,存储过程只在创建时编译,以后每次执行时不需要重新编译。
存储过程可以封装复杂的数据库操作,简化操作流程,例如对多个表的更新,删除等。
可实现模块化的程序设计,存储过程可以多次调用,提供统一的数据库访问接口,改进应用程序的可维护性。
存储过程可以增加代码的安全性,对于用户不能直接操作存储过程中引用的对象,SQL Server可以设定用户对指定存储过程的执行权限。
存储过程可以降低网络流量,存储过程代码直接存储于数据库中,在客户端与服务器的通信过程中,不会产生大量的T_SQL代码流量。

1.2存储过程的缺点:

数据库移植不方便,存储过程依赖与数据库管理系统, SQL Server 存储过程中封装的操作代码不能直接移植到其他的数据库管理系统中。
不支持面向对象的设计,无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架.
代码可读性差,不易维护。不支持集群。

二、存储过程分类

2.1系统存储过程

系统存储过程是 SQL Server系统自身提供的存储过程,可以作为命令执行各种操作。

系统存储过程主要用来从系统表中获取信息,使用系统存储过程完成数据库服务器的管理工作,为系统管理员提供帮助,为用户查看数据库对象提供方便,系统存储过程位于数据库服务器中,并且以sp_开头,系统存储过程定义在系统定义和用户定义的数据库中,在调用时不必在存储过程前加数据库限定名。例如:sp_rename系统存储过程可以修改当前数据库中用户创建对象的名称,sp_helptext存储过程可以显示规则,默认值或视图的文本信息,SQL SERVER服务器中许多的管理工作都是通过执行系统存储过程来完成的,许多系统信息也可以通过执行系统存储过程来获得。

系统存储过程创建并存放在与系统数据库master中,一些系统存储过程只能由系统管理员使用,而有些系统存储过程通过授权可以被其它用户所使用。

2.用户存储过程(自定义存储过程)

自定义存储过程即用户使用T_SQL语句编写的、为了实现某一特定业务需求,在用户数据库中编写的T_SQL语句集合,自定义存储过程可以接受输入参数、向客户端返回结果和信息,返回输出参数等。创建自定义存储过程时,存储过程名前加上"##“表示创建了一个全局的临时存储过程;存储过程前面加上”#"时,表示创建的局部临时存储过程。局部临时存储过程只能在创建它的回话中使用,会话结束时,将被删除。这两种存储过程都存储在tempdb数据库中。

用户定义的存储过程分为两类:T_SQL 和CLR

T_SQL:存储过程是值保存的T_SQL语句集合,可以接受和返回用户提供的参数,存储过程也可能从数据库向客户端应用程序返回数据。

CLR存储过程是指引用Microsoft.NET Framework公共语言的方法存储过程,可以接受和返回用户提供的参数,它们在.NET Framework程序集是作为类的公共静态方法实现的。

3.扩展存储过程

扩展存储过程是以在SQL SERVER环境外执行的动态连接(DLL文件)来实现的,可以加载到SQL SERVER实例运行的地址空间中执行,扩展存储过程可以用SQL SERVER扩展存储过程API编程,扩展存储过程以前缀"xp_"来标识,对于用户来说,扩展存储过程和普通话存储过程一样,可以用相同的方法来执行。

三、存储过程-TSql

3.1创建临时表

3.1.1根据已有表进行创建

SELECT  a.FAccountDateID ,
        a.FYearperiod ,
        a.FCompanyID ,
        a.FStartDate ,
        a.FEndDate ,
        a.FDescription ,
        a.FCreator ,
        a.FCreateTime ,
        a.FMender ,
        a.FModifyTime  
  	INTO #T_Sys_AccountDate
FROM  T_Sys_AccountDate a

3.1.1根据创建语句进行创建

create table #T_Sys_AccountDate (
   FAccountDateID       bigint               not null,
   FYearperiod          char(7)              not null,
   FCompanyID           int                  not null,
   FStartDate           datetime             not null,
   FEndDate             datetime             not null,
   FDescription         varchar(255)         null,
   FCreator             varchar(255)         not null,
   FCreateTime          datetime             null,
   FMender              varchar(255)         not null,
   FModifyTime          datetime             not null
   constraint PK_T_SYS_ACCOUNTDATE2 primary key (FAccountDateID)
)

注意:创建临时表后最后要进行删除 DROP TABLE #T_Sys_AccountDate

3.2取得主键(单个)

DECLARE @FCurrentID INT  
EXEC P_Sys_GetMaxID2 @FKeyName='T_Sys_BillNumberRule', @FID=@FCurrentID  OUTPUT 

3.3取得主键(批量)

**完成例子

3.4存储过程例子

**完成例子

四、存储过程规范

4.1存储过程头注释规范

4.1.1带返回值

/*                          
【说明】:取得主键ID                        
【参数】:@FKeyName VARCHAR(255) ,  --主键对应表字段
    	@FID BIGINT OUTPUT        --输出主键
【例子】:
       DECLARE @FCurrentID INT  
  	   EXEC P_Sys_GetMaxID2 @FKeyName='T_Sys_BillNumberRule', @FID=@FCurrentID  OUTPUT 
  	   SELECT  @FCurrentID
*/  

4.1.2执行存储过程(纯计算)

/*                          
【说明】:每日计算成本报表
		根据对应成本对象,归集相关成本成本余额                        
【参数】:@FDate DATE,                   --主键对应表字段
    	@FAccountUnitID BIGINT         --核算单位
【例子】:
        EXEC P_Cost_ComputeDailyReport @FDate='2019-10-10', @FAccountUnitID=1
*/  

4.1.3执行存储过程返回结果集

/*                          
【说明】:取得每月成本报表                   
【参数】:@FYearPeriod VARCHAR(7),       --年月
    	@FAccountUnitID BIGINT         --核算单位
【返回】:返回成本报表结果集
【例子】:
        EXEC P_Cost_GetMonthReport @FYearPeriod='2019-10', @FAccountUnitID=1
*/  

4.2存储过程过程注释规范

  1. 变量必须添加规范
  2. 流程语句添加注释规范

4.3存储过程书写规范

  1. SET NOCOUNT ON 必须书写
  2. BEGIN TRY
  3. 事务处理 BEGIN TRAN COMMIT TRAN ROLLBACK TRAN
  4. 错误中,必须回滚写入
      BEGIN CATCH  
        DECLARE @FErrMsg VARCHAR(255)  
        SELECT  @FErrMsg = ERROR_MESSAGE()  
        RAISERROR(@FErrMsg,16,1)  
        IF @@TRANCOUNT > 0  
            BEGIN  
                ROLLBACK TRAN  
            END             
    END CATCH  

五、PDM使用说明

六、存储过程写法思路

参照

1.Sqlserver基础学习

你可能感兴趣的:(Sqlserver数据库,数据库,存储过程)