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 を呼び出すと、問題が修正されます。