1

MS SQL 2005 を実行していますが、ここ数日、非常に特殊な問題が発生しています。

2 つの proc があり、1 つはデータの時間別レポートを作成します。そしてそれを呼び出し、その結果を一時テーブルに入れ、いくつかの集計を行い、要約を返します。

彼らは元気に働いています...翌朝まで。

翌朝、突然呼び出し元のレポートで、列名が無効であるというエラーが表示されます。

修正は、単に呼び出し元の proc を再コンパイルするだけで、すべてが再び正常に機能します。

これはどのように起こりますか?これらのプロセスを本番環境に移行してから、3 夜連続で発生しました。

編集: 呼び出し元 (要約) プロシージャに必要なのは再コンパイルではないようです。呼び出し先(毎時)のプロシージャを実行することで、問題を解決できました。次に、サマリー プロシージャを実行します。これは以前よりも意味がありません。

EDIT2: 1 時間ごとの proc はかなり大きいので、ここに全体を掲載することはしません。ただし、最後に 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 の定義と一致します。その後、1時間ごとのprocを数回呼び出すことになります

    INSERT #tmpTodaysSales
        EXEC HourlyProc @LocationCode, @ReportDate, null, 1


    INSERT #tmpTodaysSales
        EXEC HourlyProc @LocationCode, @LastWeekReportDate, @LastHour, 0

失敗するのはこれらの呼び出しだと思います。ただし、proc を再コンパイルするか、これ以外で時間単位の手順を実行してから、概要の proc を呼び出すと、問題が修正されます。

4

2 に答える 2

0

2 つの質問:

#DailySales8 のスキーマはまったく異なりますか? 実行日、または HourlyProc に提供されたパラメーターのいずれかに直接/間接的に依存していますか?

サマリーで の実行がINSERT #tmpTodaysSales EXEC HourlyProc ... 失敗したのはどれですか?最初と 2 番目のどちらですか?

于 2010-04-28T09:05:34.563 に答える
0

夜間の保守計画はどのようなものですか? また、翌日 2230 から 1000 の間に実行される、スケジュールされた夜間のジョブは他にありますか? メンテナンス プランのステップまたは別のエージェント ジョブが、SP を破壊する何らかの破損を引き起こしている可能性があります。

于 2010-04-26T15:10:38.243 に答える