在有的业务场景中,需要生成连续的流水号,如果不考虑其他情况,比如数据库迁移、最后一条被删除等,可以直接使用自增字段;如果要考虑以后的数据迁移,可以用这种方法:
首先有一张表,记录最大ID,每次生成流水号的时候,都是先从这张表中取出最大ID,之后+1更新:
如:

declare @serial_number int;
set @serial_number=0;
update tb1 set @serial_number=maxid,maxid=maxid+1;

这里使用update,利用的是SQL Server的更新锁,就不需要自建锁影响性能。

如果后续使用该流水号时失败,就需要整个回滚,再加个事务:

    declare @serial_number int,@status int;
    set @serial_number=0;
    set @status=0;
    begin tran tran_serial:
    begin try
        update tb1 set @serial_number=maxid,maxid=maxid+1;
        --其他业务逻辑
        insert into t_serial (serial_number) values (@serial_number);
        set @status=1;
    end try
    begin catch    --出现异常,回滚事务
        rollback tran tran_serial;
    end catch
    
    if(@status=1)
    begin    --如果执行成功没有发生异常,提交整个事务
        commit tran tran_serial;
    end

以上。