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

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

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

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

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

CREATE PROCEDURE [dbo].[SP_GetCompanyByDateTime]
@num int,
@start datetime,
@end datetime
AS
BEGIN
    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)
END
GO

修改存储过程名称:

EXEC sp_rename 'OldProcName', 'NewProcName'

删除指定存储过程:

DROP PROCEDURE ProcName

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

--根据公司ID获取访问PV值
CREATE PROCEDURE [dbo].[SP_GetVisitorRecoudCount]
@CompanyID int
AS
BEGIN
    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 @count
END
GO

--根据公司ID获取访问IP量
CREATE PROCEDURE [dbo].[SP_GetVisitorIPCount]
@CompanyID int
AS
BEGIN
    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 @count
END
GO

--填充统计临时表
CREATE procedure [dbo].[SP_FillTJSummaryTemp]
as
begin
    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 cursor1
end
go

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

猜你喜欢

转载自blog.csdn.net/yiyelanxin/article/details/72841450
今日推荐