在SQL Server中返回值并更新行而没有"干扰"

Chr*_*ård 1 t-sql sql-server

我有这个存储过程

CREATE PROCEDURE spGrabSerial
  @serial nvarchar(16) output
AS
BEGIN
  SET NOCOUNT ON;
  set @serial = (SELECT top 1 serial from tblSerial)
  update tblSerial set InUse = 1 where serial = @serial
END
Run Code Online (Sandbox Code Playgroud)

如何确保没有其他过程在选择和更新之间抓取相同的序列?

Mar*_*ith 6

假设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
Run Code Online (Sandbox Code Playgroud)

编辑刚刚提醒过这样做的方法可以直接分配给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 
Run Code Online (Sandbox Code Playgroud)