我有一个存储过程需要花费很多时间(大约5分钟)才能执行。此存储过程填满了一个表。现在我正在从该表中检索数据。我创建了一个每15分钟执行一次这个存储过程的工作。但是当存储过程正在执行时,我的表是空的,并且前端在那时没有显示结果。我的要求是始终在前端显示数据。
有没有办法缓存存储过程结果并在存储过程执行时使用该结果?
这是我的存储过程,
BEGIN
declare @day datetime
declare @maxdate datetime
set @maxdate = getdate()
set @day = Convert(Varchar(10),DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0),110)
truncate table tblOpenTicketsPerDay
while @day <= @maxdate
begin
insert into tblOpenTicketsPerDay
select convert(varchar(20),datename(dw,@day)) day_name, count(*) Open_Tickets from
(select [status], createdate, closedate
FROM OPENROWSET('MSDASQL','DSN=SQLite','Select * from tickets') AS a
where createdate <= @day
except
select [status], createdate, closedate
FROM OPENROWSET('MSDASQL','DSN=SQLite','Select * from tickets') AS a
where closedate <= @day and [status] = 'closed') x
set @day = @day + 1
end
END
任何想法都会有所帮助。
感谢。
答案 0 :(得分:1)
如果我理解正确,那么您的主要关注点是:您的存储过程会清空表格然后填写表格,因为需要时间,您的应用程序没有数据显示。
在这种情况下,您可以拥有辅助/辅助克隆表;说tblOpenTicketsPerDay_clone
并让你的存储过程填写该表而不是
insert into tblOpenTicketsPerDay_clone
select convert(varchar(20),datename(dw,@day)) day_name,
count(*) Open_Tickets from
这样,由于主表具有数据,因此应用程序将始终显示数据。一旦克隆表完成填充,然后将相同的数据传输到主表说
delete from tblOpenTicketsPerDay;
insert into tblOpenTicketsPerDay
select * from tblOpenTicketsPerDay_clone;
答案 1 :(得分:1)
不,但问题不在于缓存,这是一种非常糟糕的生成数据的方法。
将新数据生成到临时表中,然后将结果(使用merge关键字)合并到原始表中。
首先删除数据没有意义。这是一种糟糕的设计方法。