まず、問題の一般的な説明: テーブル内の合計数値を更新する定期的なプロセスを実行しています。問題は、プロセスの実行ごとに複数の更新が必要になる可能性があり、各実行が以前の結果に依存することです。
私の質問は、単一の SQL Server SP で実行できるかということです。
私のコード(サンプルを簡単にするために少し変更しました):
INSERT INTO CustomerMinuteSessions(time, customer, sessions, bytes, previousTotalSessions)
SELECT MS.time,
MS.customer,
MS.totalSessions,
MS.totalBytes,
CTS.previousTotalSessions
FROM (SELECT time, customer, SUM(sessions) as totalSessions, SUM(bytes) AS totalBytes
FROM MinuteSessions
WHERE time > @time
GROUP BY time, x) MS
CROSS APPLY TVF_GetPreviousCustomerTotalSessions(MS.customer) CTS
ORDER BY time
previousTotalSessions
列は の他の行に依存し、UpdatedTable
その値はCROSS APPLY
ingによって取得されますが、SP をそのまま実行すると、SP の実行中TVF_GetPreviousCustomerTotalSessions
に追加された行を取得せずに、すべての行が関数によって取得された値を使用します。
完全を期すために、次のTVF_GetPreviousCustomerTotalSessions
とおりです。
FUNCTION [dbo].[TVF_GetCustomerCurrentSessions]
(
@customerId int
)
RETURNS @result TABLE (PreviousNumberOfSessions int)
AS
BEGIN
INSERT INTO @result
SELECT TOP 1 (PreviousNumberOfSessions + Opened - Closed) AS PreviousNumberOfSessions
FROM CustomerMinuteSessions
WHERE CustomerId = @customerId
ORDER BY time DESC
IF @@rowcount = 0
INSERT INTO @result(PreviousNumberOfSessions) VALUES(0)
RETURN
END
クエリ内の前の行を後続の行に取得するのに最適なものは何ですか?