#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. Ура, это должно сработать нормально. Просто хотел убедиться, что для описанного выше сценария не существует простого решения.