1

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]

選択した行を一時テーブルまたは変数に一時的に保存する必要がありますか、それとももっとエレガントな方法がありますか?

4

2 に答える 2

1

型テーブルの変数でオプションを使用できます

  DECLARE @Priority TABLE (Priority int)

  UPDATE selected
    SET [State] = 1, Assigned = GETDATE()
    OUTPUT inserted.Priority INTO @Priority(Priority)
    FROM (
          SELECT TOP(1) * 
          FROM [Queue] 
          WHERE [State] = 0 
          ORDER BY [Priority] ASC, [Queued] ASC
          ) selected

 UPDATE c
   SET c.[Count] = ISNULL(c.[Count], 0) + 1
   FROM [Counter] c JOIN @Priority p ON c.[Priority] = p.[Priority]
于 2013-03-20T22:00:08.373 に答える
0

Counter テーブルで更新を実行するトリガーを Queue テーブルに追加しようとしましたか?

于 2013-03-20T19:39:43.940 に答える