存储过程,优点以及创建调用示例
什么是存储过程?
存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用。它的参数可以被传递和返回。与应用程序中的函数过程类似,存储过程可以通过名字来调用,而且它们同样有输入参数和输出参数.
近期使用存储过程写了些程序,发现存储过程很好用,好处优于SQL语句,总结如下:
存储过程的优点?
(1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。
(2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。
(3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。
(4) 分布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。
根据返回值类型的不同,我们可以将存储过程分为三类:
1.返回记录集的存储过程, 返回数值的存储过程(也可以称为标量存储过程),以及行为存储过程。顾名思义,返回记录集的存储过程的执行结果是一个记录集,典型的例子是从数据库中检索出符合某一个或几个条件的记录;
2.返回数值的存储过程执行完以后返回一个值,例如在数据库中执行一个有返回值的函数或命令;
3.行为存储过程仅仅是用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。
/*存储过程的创建实例*/
USE [数据库名称] GO /****** Object: StoredProcedure [dbo].[pro_forumTest] Script Date: 05/02/2013 16:47:18 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /*创建存储过程*/ CREATE PROCEDURE [dbo].[pro_forumTest] @userid int, @groups int, @subject varchar(256), @body ntext, @sectionid int, @type int, @resulterr varchar(50)='' output AS BEGIN if @type = 1 begin select * from dbo.spb_Users --用户 end if @type=2 begin select * from spb_ForumSectionGroups --选项组 end if @type =3 begin select * from dbo.spb_ForumSections --版块 end if @type=4 begin begin tran SET NOCOUNT ON declare @username varchar(100) --set @username ='zyllqq' select @username=UserName from dbo.spb_Users where userid=@userid; INSERT INTO [dbo].[spb_ForumThreads] ([SectionId] ,[CategoryID] ,[GroupID] ,[UserID] ,[Author] ,[IsLocked] ,[IsEssential] ,[IsSticky] ,[SpecialOrder] ,[StickyDate] ,[IsHidden] ,[HighlightDate] ,[ThreadStatus] ,[EmoticonID] ,[Price] ,[HitTimes] ,[StageHitTimes] ,[ReplyCount] ,[RssViewTimes] ,[RatingSum] ,[TotalRatings] ,[PostDate] ,[LastRepliedDate] ,[MostRecentPostAuthorID] ,[MostRecentPostAuthor] ,[MostRecentPostID] ,[StampID]) VALUES (@sectionid,-1,@groups,@userid,@username,0,0,0,0,getdate(),0,getdate(),0,0,0,0,0,0,0,0,0,getdate(),getdate(),@userid,@username,0,0) INSERT INTO [dbo].[spb_ForumPosts] ([ThreadID] ,[SectionID] ,[UserID] ,[Author] ,[Subject] ,[Body] ,[AuditingStatus] ,[UserHostAddress] ,[PostDate] ,[HighlightStyle] ,[PropertyNames] ,[PropertyValues]) VALUES(ident_current([dbo].[spb_ForumThreads]'),@sectionid,@userid,@username,@subject,@body,40,'192.168.1.63',getdate(),'','','True') update dbo.spb_ForumSections set MostRecentPostSubject=@subject,MostRecentPostID=ident_current('[dbo].[spb_ForumPosts]'),MostRecentThreadID=ident_current('[dbo].[spb_ForumThreads]') where sectionID=@sectionid if @@error<>0 begin
set @resulterr='数据导入失败' rollback tran return end else begin commit tran end end END
黄色加粗的ident_current([dbo].[spb_ForumThreads]')为主表中自增的ID. /*存储过程的调用*/ exec [dbo].[pro_forumTest] 4708,3,'为什么需要存储过程','其实存储过程并不难',4,4