我们正在运行 MS SQL 2005,过去几天我们遇到了一个非常特殊的问题。
我有两个过程,一个创建每小时的数据报告。另一个调用它,将它的结果放在一个临时表中,并进行一些聚合,然后返回一个摘要。
他们工作得很好……直到第二天早上。
第二天早上,突然来电报告,抱怨列名无效。
修复,只是调用过程的重新编译,一切正常。
这怎么可能发生?自从将这些 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 来存储结果,列列表与另一个过程中#tmpResults 的定义匹配。然后它最终调用了几次每小时的过程
INSERT #tmpTodaysSales
EXEC HourlyProc @LocationCode, @ReportDate, null, 1
INSERT #tmpTodaysSales
EXEC HourlyProc @LocationCode, @LastWeekReportDate, @LastHour, 0
我相信正是这些电话失败了。但是重新编译过程,或在此之外执行每小时过程,然后调用摘要过程可以解决问题。