存储过程总结
什么是存储过程 定义:
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
存储过程的种类:1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,
如 sp_help就是取得指定对象的相关信息
2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能
一个简单的存储过程
CREATE PROCEDURE Proc_GetBalance
@ID char(10),
@Balance money OUTPUT
AS
select @Balance = Balance from Accounts where Accounts_ID = @ID
IF @@ROWCOUNT = 1
RETURN 0
ELSE
BEGIN
SET @Balance = 0
RETURN -1
END
GO
下面对存储过程进行调用
SqlConnection conn = new SqlConnection("server=localhost;database=mybank;uid=sa;pwd=");
try
{
SqlCommand cmd = new SqlCommand("proc_GetBalance",conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@ID",1111);
SqlParameters bal = cmd.Parameters.Add("@Balance",SqlDbType.Money);
bal.Direction = ParameterDirection.OUTPUT;
SqlParameters ret = cmd.Parameters.Add("@return",SqlDbType.INT);
ret.Direction = PatameterDirection.RETURNVALUE;
cmd.ExecuteNonQuery();
int retval = (int) ret.Value;
decimal balance = (decimal) bal.Value;
}
catch(SqlException ex)
{
//捕获异常
}
finally
{
conn.Close();
}
OLE DB.NET提供程序要求Parameters集合中的参数顺序和在存储过程里定义的参数顺序一致.
触发器是定义在表上的一些SQL语句,但条件满足时它就开始执行。条件就是如往一张表插入、删除、修改记录时。
所以存储过程的执行需要你的调用。触发器只要条件满足他就执行,不需要你的调用。
注意事项:
1.在存储过程中,有些建立对象的语句是不可使用的:create default,create trigger,create procedure,create view,create rule.
2.在同一数据库中,不同的所有者可以建立相同名称的对象名。例如:a.sample,b.sample,c.sample三个数据表可以同时存在。如果存储过程中未指明对象的所有者(例如存储过程中的语句select * from sample,这句中的sample没有指明所有者),在执行的过程中默认的所有者查找顺序是:相应的存储过程的建立者->相应数据库的所有者。如果这个查找过程中没有把所有者确定下来,系统就要报错。
(这里我额外插一句:如果需要严密的数据操作,在任何操作中尽量加上所有者,例如leijun.sample)
3.在存储过程名称前边添加#或者##,所建立的存储过程则是“临时存储过程“(#是局部临时存储过程,##是全局临时存储过程)。