我们正在运行MS SQL 2005,过去几天我们遇到了一个非常奇怪的问题。
我有两个触发器,一个创建每小时数据报告。另一个调用它,将其结果放在临时表中,并进行一些聚合,并返回摘要。
他们工作正常......直到第二天早上。
第二天早上,突然调用报告,抱怨列名无效。
修复,只是重新编译调用proc,并且一切正常。
这怎么可能发生?自从将这些触发器投入生产以来,已经发生了三个晚上。
编辑:看起来,它不是调用者(摘要)过程所需的重新编译。我只是通过执行被调用者(每小时)proc来解决问题。然后执行摘要proc。这比以前没有意义。
EDIT2: 每小时的过程相当大,我不会在这里完整地发布它。但是,最后,它执行SELECT INTO,然后有条件地从创建的临时表中返回适当的结果。
Select [large column list]
into #tmpResults
From #DailySales8
Where datepart(hour,RowStartTime) >= @StartHour
and datepart(hour,RowStartTime) < @EndHour
and datepart(hour, RowStartTime) <= @LastHour
IF @UntilHour IS NOT NULL
AND EXISTS (SELECT * FROM #tmpResults WHERE datepart(hour, RowEndTime) = @UntilHour) BEGIN
SELECT *
FROM #tmpResults
WHERE datepart(hour, RowEndTime) = @UntilHour
END ELSE IF @JustLastFullHour = 1 BEGIN
DECLARE @MaxHour INT
SELECT @MaxHour = max(datepart(hour, RowEndTime)) FROM #tmpResults
IF @LastHour > 24 SELECT @LastHour = @MaxHour
SELECT *
FROM #tmpResults
WHERE datepart(hour, RowEndTime) = @LastHour
IF @@ROWCOUNT = 0 BEGIN
SELECT *
FROM #tmpResults
WHERE datepart(hour, RowEndTime) = @MaxHour
END
END ELSE BEGIN
SELECT * FROM #tmpResults
END
然后它会删除所有临时表并结束。
来电者(摘要)
首先创建一个临时表#tmpTodaySales来存储结果,列列表在另一个proc中匹配#tmpResults的定义。然后它最终调用每小时proc几次
INSERT #tmpTodaysSales
EXEC HourlyProc @LocationCode, @ReportDate, null, 1
INSERT #tmpTodaysSales
EXEC HourlyProc @LocationCode, @LastWeekReportDate, @LastHour, 0
我相信这些电话会失败。但是重新编译proc,或者在此之外执行每小时程序,然后调用summary proc来解决问题。
答案 0 :(得分:0)
隔夜维护计划是什么样的,是否有其他预定的隔夜工作在第二天的2230到1000之间运行?维护计划或其他代理工作中的步骤可能导致某种破坏您的SP的腐败。
答案 1 :(得分:0)
两个问题:
#DailySales8的架构是否有所不同?是否对执行日期或提供给HourlyProc的任何参数有直接/间接依赖性?
摘要中哪个INSERT #tmpTodaysSales EXEC HourlyProc ...
执行失败 - 第一个还是第二个?