Проголосуйте за ответ Cade Roux, используя OUTPUT:
UPDATE #tbl
SET locked = 1
OUTPUT INSERTED.*
WHERE id IN (SELECT TOP 1 id
FROM #tbl
WHERE locked = 0
ORDER BY id)
Ранее:
Это один из немногих случаев, когда я могу использовать временную таблицу:
ALTER PROCEDURE temp_table_test
AS
BEGIN
SELECT TOP 5000 *
INTO #temp_test
FROM your_table
WHERE locked != 1
ORDER BY ?
UPDATE your_table
SET locked = 1
WHERE id IN (SELECT id FROM #temp_test)
SELECT *
FROM #temp_test
IF EXISTS (SELECT NULL
FROM tempdb.dbo.sysobjects
WHERE ID = OBJECT_ID(N'tempdb..#temp_test'))
BEGIN
DROP TABLE #temp_test
END
END
Это:
- Извлекает нужные вам строки, помещает их в локальную временную таблицу
- Использует временную таблицу для обновления строк, которые будут «заблокированы»
- ВЫБИРАЕТ из временной таблицы, чтобы дать вам свой вывод результатов
- Удаляет временную таблицу, потому что они живут для сеанса