SQL存储过程的优点、创建、互相调用与调试

来源:互联网 发布:世界历史数据库 编辑:程序博客网 时间:2024/06/06 01:21

存储过程的优点:
1.只在创建时编译,一般sql语句每执行一次就编译一次,另外,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用,因此可提高数据库执行速率。
2.可以实现只连接一次数据库就可以完成一个复杂的操作,如对多个表进行INSERT,UPDATE,DELETE,SELECT时,可将此复杂操作利用存储过程封装起来与数据库提供的事务处理结合使用,而不需要多次连接数据库。
3.可以重复使用、更稳定、安全,可限定使用权。
4.独立于程序,使得程序与数据库的工作独立进行。

创建一个简单的存储过程:

CREATE PROCEDURE [dbo].[SP_GetBrandByABC]@abc varchar(50),@top intASBEGIN    select top(@top) BrandID,BrandName,BrandImg from LB_Brand where ABC=@abc and Auditing=1 and Isdelete=0 order by IsCommend desc,PageRank ascEND

实现sql拼接字符串的存储过程如下:

CREATE PROCEDURE [dbo].[SP_GetCompanyByDateTime]@num int,@start datetime,@end datetimeASBEGIN    declare @sql varchar(8000)    set @sql='select'    if @num>0        set @sql=@sql+' top('+convert(varchar(10),@num)+')'    set @sql=@sql+' CompanyID,ChildUrl,CompanyName from LB_Company where Auditing=1'    if (@start is null)or(@end is null)         set @sql=@sql+' order by CompanyID DESC'    else        set @sql=@sql+' and Addtime>'''+convert(varchar(50),@start)+''' and AddTime<='''+convert(varchar(50),@end)+''' order by CompanyID DESC'    print @sql --用于本地查看sql语句,当用于生产时将此行去掉,因为会占用很大内存    exec(@sql)ENDGO

修改存储过程名称:

EXEC sp_rename 'OldProcName', 'NewProcName'

删除指定存储过程:

DROP PROCEDURE ProcName

存储过程调用另一个存储过程:

--根据公司ID获取访问PV值CREATE PROCEDURE [dbo].[SP_GetVisitorRecoudCount]@CompanyID intASBEGIN    select @count=count(0) from (select count(0) as row from TJ_VisitorRecord b inner join ViewRecord c on b.VRID=c.VRID where DateDiff(dd,outTime,getdate())<=@TimePeriod and c.QueryPar1=@CompanyID group by b.VRID) as t     return @countENDGO--根据公司ID获取访问IP量CREATE PROCEDURE [dbo].[SP_GetVisitorIPCount]@CompanyID intASBEGIN    declare @count int    select @count=count(0) from (SELECT count(0) as row FROM ViewRecord where DateDiff(dd,ViewTime,getdate())<=@TimePeriod and QueryPar1=@CompanyID group by ViewIP) as t    return @countENDGO--填充统计临时表CREATE procedure [dbo].[SP_FillTJSummaryTemp]asbegin    declare @CompanyID int    declare cursor1 cursor for     select CompanyID from LB_Company where Auditing=1    open cursor1    fetch next from cursor1 into @CompanyID    while @@fetch_status=0    begin        declare @strWhere nvarchar(50),@strWhere2 nvarchar(50),@PV int,@IP int,@UV int,@AccessTimes int        --一天前(昨天)        exec @PV=GetViewRecordCount 1,@CompanyID --调用存储过程GetViewRecordCount         exec @IP=GetVisitorIPCount 1,@CompanyID --调用存储过程GetVisitorIPCount         insert into TJ_Statistics(CompanyID, AddDate, PV, IP) values        (@CompanyID,dateadd(day, -1, getdate()),@PV,@IP)        fetch next from cursor1 into @CompanyID    end    close cursor1    deallocate cursor1endgo

另一个优点是当存储过程存在异常时,可以在查询分析器中进行实时调试,从而分析出问题所在。具体方法如下:
假设你的存储过程是ProcTest,传入参数为@num=2,@key=’abc’
在查询分析器窗口中写入语句:
exec ProcTest 2,’abc’
然后点击调试窗口中的“启动调试“,进入调试界面,按F11进行单步调试即可进入存储过程。