存储过程在一夜之间破裂

时间:2010-04-26 13:59:57

标签: sql-server-2005 stored-procedures sql-execution-plan

我们正在运行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来解决问题。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

两个问题:

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

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