16,554
社区成员
发帖
与我相关
我的任务
分享
ALTER PROCEDURE [DBO].[GETMAINSERIAL]
AS
DECLARE @SERIAL BIGINT
SELECT @SERIAL = PREVSERIAL FROM MAINSERIAL
IF @SERIAL = 9999999999 BEGIN SET @SERIAL = 0
SET @SERIAL = @SERIAL +1
UPDATE MAINSERIAL SET PREVSERIAL = @SERIAL
SELECT 'CS' + REPLACE( STR(@SERIAL,10,0), ' ' , '0' )
RETURN
if object_id('dbo.sequence') is not null
drop table dbo.sequence;
go
create table dbo.sequence (id bigint);
go
insert into dbo.sequence values(0);
go
if object_id('dbo.get_sequence') is not null
drop procedure dbo.get_sequence
go
create procedure dbo.get_sequence
as
declare @id bigint;
update sequence
set @id=(case when id<9999999999 then id else 0 end), id=@id+1;
select 'cs'+right('000000000'+ltrim(@id),10);
go
-- 测试
-- 会话 1
while 1=1
exec dbo.get_sequence;
-- 会话 2
while 1=1
exec dbo.get_sequence;
exec sp_getapplock 'ProcLock','Exclusive','Session','PrcoUserRole'
exec [DBO].[GETMAINSERIAL]
exec sp_releaseapplock 'ProcLock','Session'
create table MAINSERIAL(PREVSERIAL nvarchar(10))
insert into mainserial select '0000000001'
go
CREATE PROCEDURE [DBO].[GETMAINSERIAL]
AS
update mainserial set prevserial=
(case when prevserial='9999999999' then '0000000000' else
right('0000000000'+convert(nvarchar(10),prevserial+1),10) end)
go
exec getmainserial
select * from mainserial
go
drop table mainserial
drop procedure getmainserial
/*
PREVSERIAL
----------
0000000002
(1 行受影响)
*/
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE