1、表结构和效果图,这个表是用来存储基础因子的,需要的可以拓展字段,比如,升序,降序,起始序号等。
SQL code
CREATE TABLE [dbo].[SerialNo](
[sCode] [varchar](50) NOT NULL,--主键也是多个流水号的类别区分
[sName] [varchar](100) NULL,--名称,备注形式
[sQZ] [varchar](50) NULL,--前缀
[sValue] [varchar](80) NULL,--因子字段
CONSTRAINT [PK_SerialNo] PRIMARY KEY CLUSTERED
(
[sCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
2、存储过程代码
Create procedure [dbo].[GetSerialNo]
(
@sCode varchar(50)
)
as
--exec GetSerialNo
begin
Declare @sValue varchar(16),
@dToday datetime,
@sQZ varchar(50) --这个代表前缀
Begin Tran
Begin Try
-- 锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了
--在同一个事物中,执行了update语句之后就会启动锁
Update SerialNo set sValue=sValue where sCode=@sCode
Select @sValue = sValue From SerialNo where sCode=@sCode
Select @sQZ = sQZ From SerialNo where sCode=@sCode
-- 因子表中没有记录,插入初始值
If @sValue is null
Begin
Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + '000001')
Update SerialNo set sValue=@sValue where sCode=@sCode
end else
Begin --因子表中没有记录
Select @dToday = substring(@sValue,1,6)
--如果日期相等,则加1
If @dToday = convert(varchar(6), getdate(), 12)
Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1))
else --如果日期不相等,则先赋值日期,流水号从1开始
Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +'000001')
Update SerialNo set sValue =@sValue where sCode=@sCode
End
Select result = @sQZ+@sValue
Commit Tran
End Try
Begin Catch
Rollback Tran
Select result = 'Error'
End Catch
end
exec getserialno ‘service’
另外一个:
代码
DROP PROCEDURE PRO_AutoLSH
GO
CREATE PROCEDURE PRO_AutoLSH
(
@letter varchar(10), --首字母,可以多个字母
@LSHkey varchar(20), --表中的流水号列名,最好是主键
@tablename varchar(20) --表名
)
AS
begin
DECLARE @LSHID NVARCHAR(20)
DECLARE @TLSH VARCHAR(20)
DECLARE @NUM INT
DECLARE @sql NVARCHAR(200)
----查询该表最大的流水号
SET @sql='SELECT ISNULL(MAX(CONVERT(INT,SUBSTRING('+@LSHkey+',8,4))),0)+1 FROM '+@tablename
--创建临时表
CREATE TABLE TEMP1(TOTAL INT);
--写入查询得到的数据
INSERT INTO TEMP1 EXEC(@sql);
--再查询出值
SET @NUM=(SELECT TOTAL FROM TEMP1)
DROP TABLE TEMP1
--拼接下一个流水号:J+年份4位+月份2位+4位编号(如J2010120001)
SET @TLSH=@letter+SUBSTRING(CONVERT(VARCHAR(100),GETDATE(),112),1,6)+SUBSTRING(CONVERT(CHAR(5),10000+@NUM),2,4)
SET @sql=''
SET @sql='SELECT @LSH='+''''+@TLSH+''''+' FROM '+@tablename
EXEC sp_executesql @sql,N'@LSH NVARCHAR(20) OUTPUT',@LSHID OUTPUT SELECT @LSHID
end