Я использую SQL Server 2017 Express для реализации высокопроизводительной очереди (FIFO push & pop) - под «высокой производительностью» я подразумеваю каждую миллисекунду для моего приложения.
В итоге я реализовалфункция pop
очереди выглядит следующим образом:
BEGIN TRY
DECLARE @QueueID [int] = null;
--get the id of the top 1 item
SELECT TOP 1 @QueueID = [QueueID]
FROM [dbo].[ReceiverQueue] WITH (NOLOCK);
--pop that item
SELECT [QueueDateTime], [Packet], [Status]
FROM [dbo].[ReceiverQueue]
WHERE [QueueID] = @QueueID
OPTION (FAST 1);
--delete that item from the queue
DELETE FROM [dbo].[ReceiverQueue]
WHERE [QueueID] = @QueueID;
--return the popped columns
RETURN;
END TRY
BEGIN CATCH
--return exception, if pop fails
EXECUTE [dbo].[sp.GetLastError]
END CATCH;
В некоторых решениях, с которыми я сталкивался в StackOverflow, используются временные таблицы для сохранения набора результатов в хранимой процедуре для дальнейшего использования (в моем случае дляDELETE
оператор, следующий за SELECT
);и я создал короткий вариант этого, как показано выше ...
Тем не менее, мне было интересно, существует ли такой вариант?
SELECT TOP 1
@QueueID = [QueueID], [QueueDateTime], [Packet], [Status]
FROM
[dbo].[ReceiverQueue] WITH (NOLOCK);
или этот?
DELETE FROM [dbo].[ReceiverQueue]
WHERE [QueueID] = SELECTED.QueueID;
Пробовал похоже, но зря.
Заранее спасибо.
PS: QueueID
- это столбец IDENTITY