SQLServer存储过程学习记录

简单来讲,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,可是其做用不只限于批处理。sql

1、存储过程的概述数据库

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

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

存储过程的优势:服务器

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

存储过程的缺点:网络

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

  说一下本身对存储过程的理解:对于SQLServer中的存储过程,和C#中的函数和类似,能够理解为一个函数,能够给存储过程携带参数,能够有返回值,能够带有output参数,也可让参数带默认值。这样子理解可让本身快速理解存储过程框架

2、存储过程的分类ide

  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、存储过程的建立

  准备数据 以下:

use Test;
--建立测试books表
create table Money (
    id int identity(1,1) primary key,
    money int
);

  里面插入若干条测试数据

  1.建立一个无参存储过程

if exists(select * from sysobjects where name='usp_getAllMoneyInfo')
drop proc usp_getAllMoneyInfo
go
--存储过程至关于一个函数 能够有参数,输出参数 as后为方法体 使用return进行返回--
create proc usp_getAllMoneyInfo
--as前面为定义参数 至关于函数中的参数, 不用进行声明--
as
select * from Money
go

  执行存储过程

exec usp_getAllMoneyInfo 

  删除存储过程

drop proc usp_getAllMoneyInfo

  修改存储过程

alter procedure usp_getAllMoneyInfo
as
**********
go

 

2.建立一个带参数的存储过程 并执行

if exists(select * from sysobjects where name='usp_getMoneyInfo')
drop proc usp_getMoneyInfo
go
--存储过程至关于一个函数 能够有参数,输出参数 as后为方法体 使用return进行返回--
create proc usp_getAllMoneyInfo
--as前面为定义参数 至关于函数中的参数, 不用进行声明--
@id int
as
select * from Money where id=@id
go
exec usp_getMoneyInfo 2 --在调用后面添加参数--

3.建立一个带output参数的存储过程 并执行

if exists(select * from sysobjects where name='usp_getAllMoneyCount')
drop proc usp_getAllMoneyInfo
go
create proc usp_getAllMoneyCount
@count int output --外部参数在后面加output 相似于C#的out--
as
set @count = (select count(*) from Money)
go

declare @cnt int;
exec usp_getAllMoneyCount @count=@cnt output --在调用的时候 要加output的关键字-
print @cnt

4.建立一个带有返回值的存储过程 并执行

-带有返回值的存储过程--
--return只能返回整型的数据,若是须要返回其余类型的数据,须要使用output输出参数--
if exists(select * from sysobjects where name='usp_getCount')
drop proc usp_getAllMoneyInfo
go
create proc usp_getCount

as
declare @count int
set @count = (select count(*) from Money)
return @count
go
declare @totalCount int
exec @totalCount = usp_getCount  --获取返回值的格式:在exec后面添加返回值变量=--
print @totalCount
相关文章
相关标签/搜索