Sql server 2005 存储进程一夜之间中断

Sql server 2005 存储进程一夜之间中断,sql-server-2005,stored-procedures,sql-execution-plan,Sql Server 2005,Stored Procedures,Sql Execution Plan,我们正在运行MS SQL 2005,在过去几天中,我们遇到了一个非常特殊的问题 我有两个过程,一个是创建每小时一次的数据报告。另一个调用它,将其结果放入临时表中,进行一些聚合,并返回摘要 他们工作得很好…直到第二天早上 第二天早上,呼叫报告突然抱怨列名无效 修复程序只是对调用过程的重新编译,一切都很好 这怎么会发生?自从这些程序投入生产以来,已经连续三个晚上发生了 编辑:似乎调用方摘要过程不需要重新编译。我只是通过执行被调用方的每小时进程来解决这个问题。然后执行summary进程。这就没有以前那

我们正在运行MS SQL 2005,在过去几天中,我们遇到了一个非常特殊的问题

我有两个过程,一个是创建每小时一次的数据报告。另一个调用它,将其结果放入临时表中,进行一些聚合,并返回摘要

他们工作得很好…直到第二天早上

第二天早上,呼叫报告突然抱怨列名无效

修复程序只是对调用过程的重新编译,一切都很好

这怎么会发生?自从这些程序投入生产以来,已经连续三个晚上发生了

编辑:似乎调用方摘要过程不需要重新编译。我只是通过执行被调用方的每小时进程来解决这个问题。然后执行summary进程。这就没有以前那么有意义了

编辑2: 每小时的进程相当大,我不会把它全部发布在这里。但是,在最后,它执行一个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

我相信是这些电话失败了。但是重新编译过程,或者在此之外执行每小时一次的过程,然后调用摘要过程可以解决问题。

夜间维护计划是什么样子的,是否有其他计划的夜间作业在第二天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