1 つの一意の行を返す SQL スクリプトがあります。その行の 1 つの列と別のテーブルのカウンターを更新したい
私は一種の作業項目キューをモデル化し、キューから 1 つの要素が選択されると、その状態は「実行中」に設定されますが、特定の優先度の項目がいくつ選択されたかを追跡したいと考えています。
以下は、カウントに使用されるテーブルのないスクリプトです
IF OBJECT_ID(N'[Queue]', N'U') IS NOT NULL
DROP TABLE [Queue]
CREATE TABLE [Queue](
[ID] int IDENTITY(1,1) NOT NULL,
[Priority] int NOT NULL default 3,
[State] int NOT NULL default 0,
[Command] nvarchar(max),
[Queued] datetime2 NOT NULL default GetDate(),
[Assigned] datetime2 NULL
)
INSERT INTO [Queue] ([Command], [Priority], [Queued]) VALUES
('systeminfo', 1, DATEADD(MILLISECOND, -40, GETDATE())),
('systeminfo', 2, DATEADD(MILLISECOND, -30, GETDATE())),
('systeminfo', 1, DATEADD(MILLISECOND, -20, GETDATE())),
('systeminfo', 3, DATEADD(MILLISECOND, -20, GETDATE()))
GO
IF OBJECT_ID(N'Dequeue', N'P') IS NOT NULL
DROP PROCEDURE Dequeue
GO
CREATE PROCEDURE Dequeue
AS
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
UPDATE selected
SET [State] = 1, Assigned = GETDATE()
OUTPUT inserted.*
FROM (
SELECT TOP(1) *
FROM [Queue]
WHERE [State] = 0
ORDER BY [Priority] ASC, [Queued] ASC
) selected
ストアド プロシージャの update ステートメントも次のようにする必要があります。
UPDATE [Counter]
SET [Counter].[Count] = [Counter].[Count] + 1
WHERE [Counter][Priority] = selected.[Priority]
選択した行を一時テーブルまたは変数に一時的に保存する必要がありますか、それとももっとエレガントな方法がありますか?