Реализация очереди на MSSQL 2005 и выше

Tsql теория > Реализация очереди на MSSQL 2005 и выше
01.04.2013 14:05:02



Статья:

-- Таблица, которую будем разгребать при помощи очереди
IF OBJECT_ID('dbo.Queue') IS NOT NULL 
   DROP TABLE dbo.[Queue]
CREATE TABLE dbo.[Queue]
(
  [QueueID] INT PRIMARY KEY ,
  [OrderID] INT IDENTITY(1, 1)
                UNIQUE
)
-- Заполняем таблицу-очередь фиктивными данными
INSERT  dbo.[Queue]
        ( [QueueID] )
VALUES  ( 1 ),
        ( 3 ),
        ( 2 )
-- Начинаем разбор очереди
WHILE EXISTS ( SELECT *
               FROM   dbo.[Queue] ) 
      BEGIN
   -- Пересоздаем выходной список переменных
            DECLARE @Queue TABLE ( QueueID INT )
            DELETE  @Queue
      
   -- Берем из очереди первого вставшего
            DELETE TOP ( 1 )
                    Q
            OUTPUT  deleted.QueueID
                    INTO @Queue
            FROM    dbo.[Queue] Q
            JOIN    (
                      SELECT TOP 1
                              [QueueID]
                      FROM    dbo.[Queue]
                      ORDER BY [OrderID]
                    ) QSorted ON Q.[QueueID] = QSorted.[QueueID]
   
   -- Отдаем первого вставшего в работу другому модулю...
            SELECT  *
            FROM    @Queue
      END