略谈SQL中的存储过程
对于数据库,一直在增,删,查,改这四个操作中转悠徘徊,没去想太多数据其他的东西。最近发现数据库中等待发现的,等待学习的,等待挖掘的东西太多了。我一直没去搞清楚游标,存储过程以及触发器等等这些知识概念,从没有想过数据库的优化工作和代码简化工作。
之前写了一篇关于数据库的触发器,这一篇主要谈一下数据库的存储过程。
首先SQL Server支持5种类型的存储过程:
系统存储过程,本地存储过程,临时存储过程,远程存储过程,扩展存储过程
1.系统存储过程:由系统提供的存储过程,可以作为命令执行各种操作。系统存储过程定义在系统数据库master中,前缀是sp_。
系统存储过程允许系统管理员执行修改系统表的数据库管理任务,可以在任何一个数据库中执行。
2.本地存储过程:本地存储过程是指在用户数据库中创建的存储过程,这种存储过程完成特定数据库操作任务,其名称不能以sp_为前缀。
3.临时存储过程:属于本地存储过程。
如果名称前面有一个"#",该存储过程就称为局部临时存储过程,这种存储过程只能在一个用户会话中使用。
如果名称前面有两个"#",该存储过程就称为全局临时存储过程,这种存储过程可以在所有用户会话中使用。
4.远程存储过程:指从远程服务器上调用的存储过程。
5.扩展存储过程:在SQL环境之外执行的动态链接库称为扩展存储过程,其前缀是sp_。使用是需要加载到SQL系统中,而且按照使用存储过程的方法执行。
其次就是存储过程的定义和执行
用户存储过程只能定义在当前的数据库中,临时存储过程总是在tempdb中创建。
1.定义:语句是create procedure,基本格式为:
create proc 存储过程名
***
***
as <sql语句>[....n]
其中,存储过程必须符合标识符规则,且对于数据库及其所有者必须唯一。
可以在存储过程名之前加上"#"或者"##",从而创建局部或全局临时存储过程。
存储过程中带的参数必须以@符号作为第一个字符来指定参数名称,可以声明一个或者多个参数,也可以为参数指定默认值。
cursor类型只能用于output参数。如果指定参数类型为cursor,则必须同时指定varying和output关键字。
说了这么多,也不想讲那些个概念性的知识了,其实知道怎么用才是王道。
例子一:
use spdg --检查是否已经存在同名的存储过程,若有,则删除-- if exists (select name from sysobjects where name = ‘kh_info‘ and type = ‘p‘) drop proceduce kh_info go --创建存储过程-- create proceduce kh_info as select a.客户名称 isnull(数量,0) from khb a
这里定义的存储过程kh_info没有输入和输出参数,不需要与调用者传递数据。
可以使用execute kh_info或者exec kh_info
例子二:
use spdg if exists (select name form sysobjects where name=‘kh_info‘ and type=‘p‘) drop proceduce kh_info go create proceduce kh_info @khname vachar(20),@spname varchar(50) as select x.客户编号,sum(x.数量) as 总数量 from (select a.客户编号 isnull(数量,0) as 数量 from khb a left join spdgb b on a.客户编号 = b.客户编号 left join spb c on b.商品编号 = c.商品编号 where a.客户姓名 = @khname and c.商品名称 = @spname ) x group by x.客户编号 go
以上存储过程使用两个输入参数:
@khname(用于传入客户姓名) @spname(用于传入商品名称)
执行方式:
exec kh_info ‘甲‘,‘乙‘
或者exec kh_info @khname=‘甲‘,@spname=‘乙‘
或者exec kh_info @spname=‘乙‘,@khname=‘甲‘