Хранимый процесс SQL Server — необходимо вернуть результирующий набор до завершения выполнения

#sql #sql-server #tsql #stored-procedures

#sql #sql-server #tsql #хранимые процедуры

Вопрос:

У меня есть таблица соревнований с полем ‘WinningTime’. Каждый день первый пользователь, отправивший запрос после этого времени, выигрывает соревнование, однако у него ограниченное время для ответа (скажем, 10 минут). Если они не отвечают в течение этого времени, соревнование считается не выигранным, так что победит следующий пользователь.

Что я пытаюсь сделать, так это создать процедуру, которая вернет выигрышную строку из таблицы, пометит ее как выигранную, а затем через 10 минут запустит другую процедуру, которая определит, ответил ли пользователь, и решит, сбрасывать поле «Выиграл» или нет.

У меня все это работает, за исключением того, что задержка ОЖИДАНИЯ, которую я использую, также задерживает возврат результирующего набора. Есть ли какой-либо способ заставить хранимый процесс возвращать SELECT результаты до завершения выполнения ЗАДЕРЖКИ?

 BEGIN
DECLARE @ID int


IF EXISTS(
    SELECT      ID
    FROM        Competitions
    WHERE       COALESCE(Won, 0) != 1
    AND         WinningTime < GetDate()
)
BEGIN
    --If we have a winner then select the row (whilst locking the table to prevent multiple winners), then update the row to mark the competition as being won
    BEGIN TRAN

        --Select row

        --Update row to mark it as 'Won'

    COMMIT TRAN

    --** We need to return the previous select before executing this **

    WAITFOR DELAY '000:10:00'
    EXECUTE ResetCompetition @CompID = @ID;

END
END
 

Я заменил некоторые sql комментариями для краткости

Комментарии:

1. Разделите его на две хранимые процедуры и вызовите вторую, когда получите результат от первой.

2. Ура, это должно сработать нормально. Просто хотел убедиться, что для описанного выше сценария не существует простого решения.