1

我们正在运行 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

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

4

2 回答 2

0

隔夜维护计划是什么样的,是否还有其他计划的隔夜作业在第二天 2230 到 1000 之间运行?维护计划中的步骤或其他代理作业可能会导致某种破坏您的 SP 的损坏。

于 2010-04-26T15:10:38.243 回答
0

两个问题:

#DailySales8 的架构是否完全不同?它是否对执行日期或提供给 HourlyProc 的任何参数有任何直接/间接的依赖关系?

摘要中的哪个执行INSERT #tmpTodaysSales EXEC HourlyProc ... 失败 - 第一次还是第二次?

于 2010-04-28T09:05:34.563 回答