您的位置:首页 > 数据库

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

2017-06-02 09:53 381 查看
存储过程的优点:

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进行单步调试即可进入存储过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息