Как удалить выбранный столбец в SQL Server внутри хранимой процедуры - PullRequest
0 голосов
/ 08 октября 2019

Я использую 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

Ответы [ 3 ]

1 голос
/ 08 октября 2019

Если производительность связана с проблемой, и вам нужно ORDER BY, чтобы убедиться, что удаленная строка действительно является первой логически, которую вы можете попробовать удалить из CTE

with c as (
   SELECT top(1) *
   FROM [dbo].[ReceiverQueue] 
   ORDER BY [QueueID]
)
delete from c
output deleted.[QueueDateTime], 
    deleted.[Packet], 
    deleted.[Status] 
1 голос
/ 08 октября 2019

Если у вас SQL Server 2005 или выше (и если у вас его нет, вам действительно нужно обновить), вы можете POP свои данные, используя предложение OUTPUT оператора DELETE, например:

DELETE 
FROM [dbo].[ReceiverQueue] 
OUTPUT deleted.[QueueDateTime], 
    deleted.[Packet], 
    deleted.[Status] 
WHERE [QueueID] = (
    SELECT TOP 1 [QueueID] 
    FROM [dbo].[ReceiverQueue] WITH (NOLOCK)
    )
0 голосов
/ 08 октября 2019

Спасибо всем вам;очень ценю быстрые полезные ответы.

Скомбинировал ваши рекомендации и придумал вариант:

    --pop top 1 row
    DELETE TOP (1) FROM [dbo].[ReceiverQueue] OUTPUT DELETED.*;
    --return the popped columns 
    RETURN;

Работал как шарм! :)

PS. Порядок сортировки все еще может быть беспорядочным, как указал Серг;нужно изучить это обсуждение в этом отношении ... Но пока вышеприведенная версия выглядит достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...