简单来讲,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,可是其做用不只限于批处理。sql
1、存储过程的概述数据库
SQL Server中的存储过程是使用T_SQL编写的代码段。它的目的在于可以方便的从系统表中查询信息,或者完成与更新数据库表相关的管理任务和其余的系统管理任务.T_SQL语句是SQL Server数据库与应用程序之间的编程接口。在不少状况下,一些代码会被开发者重复编写屡次,若是每次都编写相同功能的代码,不但繁琐,并且容易出错,并且因为SQL Server逐条的执行语句会下降系统的运行效率。编程
简而言之,存储过程就是SQL Server为了实现特定任务,而将一些须要屡次调用的固定操做语句编写成程序段,这些程序段存储在服务器上,有数据库服务器经过程序来调用。安全
存储过程的优势:服务器
存储过程的缺点:网络
说一下本身对存储过程的理解:对于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