Sql server 2005 存储进程一夜之间中断
我们正在运行MS SQL 2005,在过去几天中,我们遇到了一个非常特殊的问题 我有两个过程,一个是创建每小时一次的数据报告。另一个调用它,将其结果放入临时表中,进行一些聚合,并返回摘要 他们工作得很好…直到第二天早上 第二天早上,呼叫报告突然抱怨列名无效 修复程序只是对调用过程的重新编译,一切都很好 这怎么会发生?自从这些程序投入生产以来,已经连续三个晚上发生了 编辑:似乎调用方摘要过程不需要重新编译。我只是通过执行被调用方的每小时进程来解决这个问题。然后执行summary进程。这就没有以前那么有意义了 编辑2: 每小时的进程相当大,我不会把它全部发布在这里。但是,在最后,它执行一个SELECT INTO,然后有条件地从创建的临时表返回适当的结果Sql server 2005 存储进程一夜之间中断,sql-server-2005,stored-procedures,sql-execution-plan,Sql Server 2005,Stored Procedures,Sql Execution Plan,我们正在运行MS SQL 2005,在过去几天中,我们遇到了一个非常特殊的问题 我有两个过程,一个是创建每小时一次的数据报告。另一个调用它,将其结果放入临时表中,进行一些聚合,并返回摘要 他们工作得很好…直到第二天早上 第二天早上,呼叫报告突然抱怨列名无效 修复程序只是对调用过程的重新编译,一切都很好 这怎么会发生?自从这些程序投入生产以来,已经连续三个晚上发生了 编辑:似乎调用方摘要过程不需要重新编译。我只是通过执行被调用方的每小时进程来解决这个问题。然后执行summary进程。这就没有以前那
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
我相信是这些电话失败了。但是重新编译过程,或者在此之外执行每小时一次的过程,然后调用摘要过程可以解决问题。夜间维护计划是什么样子的,是否有其他计划的夜间作业在第二天2230到1000之间运行?维护计划中的步骤或其他代理作业可能导致某种破坏SP的损坏。两个问题: DailySales8的模式是否完全不同?它是否直接/间接依赖于执行日期或提供给HourlyProc的任何参数
插入tmpTodaysSales EXEC HourlyProc的哪个执行。。。在摘要中失败-第一次还是第二次?您可以发布过程定义吗?您可以发布一些代码片段来说明问题吗?由于试图计算23:00和00:00之间的差异,报表创建过程结果或摘要过程创建的临时表中是否缺少缺少的列?黑暗中的野生快照-计算中的负数?问题不在于过程定义。他们都很好。一旦调用方摘要被重新编译,它就会工作。没有对其进行任何更改,但第二天,它将再次失败。两个过程都没有改变。@Paolo,我不这么认为。它实际上不是一夜之间就能运行的。最后一次运行是在2230成功,然后在第二天1000再次运行失败。在重新编译之前,无论何时,它都会失败。不,DailySales8的模式不会改变。是的,这直接取决于执行日期。它正在创建最新的销售报告,因此它使用当前日期或传入的日期来检索销售报告。我不确定哪一个失败了。事实证明,两者之间存在一个隐藏的需求,它们依赖于彼此的结果。糟糕的设计。自那以后,这一问题得到了解决。
INSERT #tmpTodaysSales
EXEC HourlyProc @LocationCode, @ReportDate, null, 1
INSERT #tmpTodaysSales
EXEC HourlyProc @LocationCode, @LastWeekReportDate, @LastHour, 0