什么是存储过程
存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句。
为什么要用存储过程
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
例子表Student
无参数存储过程
create proc Proc1
as //此处 as 不可以省略不写
begin //begin 和 end 是一对,相当于花括号,形成一个语句块,结构清晰,不可以只写其中一个,但可以都不写
select * from Student
end
go //go在存储过程或语句中起结束,终止上面语句的作用。标识一批sql到这里就要提交执行,相当于一个批处理
修改存储过程
alter proc Proc1
as
select No from Student
go
执行存储过程
exec Proc1
有返回值的存储过程
@@rowcount表示返回受影响的行数
alter proc Proc1
as
update Student set Grade=Grade+1 where No < 3
return @@rowcount
go
有输入参数的存储过程
alter proc Proc1
@no int
as
select * from Student where No=@no
go
--执行该存储过程
exec Proc1 2 或者 exec Proc1 @no=2
使用out
Out相当于C#中的ref参数(传进、传出缺一不可),而且传进传出的时候都要标识为ref
alter proc Proc1
@no int,
@count int out
as
set @count = @count+@no
go
--执行该存储过程
declare @Receive int --声明变量
set @Receive =100 --给变量赋值
exec Proc1 2,@Receive out --传入两个变量
select @Receive --值为102
使用output
相当于存储过程的返回值,不能传入,它是在存储过程中定义,并且输出的
--传入no,返回No比no大的有多少个
alter proc Proc1
@no int,
@count int output
as
select @count=COUNT(*) from Student where No>@no
go
--执行该存储过程
declare @Receive int --声明一个变量用来接收存储过程的@count
exec Proc1 2,@Receive output
select @Receive
使用NOCOUNT
SET NOCOUNT { ON | OFF }
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
我们应该在存储过程的头部加上SET NOCOUNT ON 这样的话,在退出存储过程的时候加上 SET NOCOUNT OFF这样的话,以达到优化存储过程的目的