Предполагая SQL Server 2005+, вы можете использовать предложение OUTPUT
, чтобы сделать это за одну атомарную операцию (см. Использование таблиц в качестве очередей ).
;with cte as (
select top(1)
serial, InUse
from tblSerial with (rowlock, readpast)
where InUse <> 1
order by serial
)
update cte
set InUse = 1
output inserted.serial
Редактировать Только что напомнили о способе выполнения этого, который может напрямую назначаться параметру output
без использования предложения OUTPUT
.
with cte as (
select top(1)
serial, InUse
from tblSerial with (rowlock, readpast)
where InUse <> 1
order by serial
)
update cte
set InUse = 1, @serial = serial