这个序列号,通常是在保存时才生成的。如果提前就生成了,那在多个人同时进行操作时,会重号的。 生成方式可以用数据库来生成或是由程序来生成。 先生成一个字符串“S+年月日”,今天就是S20131008,再在表中查询“select max(序列号) 序列号 from 表 where 序列号 like 'S20131008%'”,看有没有查询到结果,如果没查到,就用S20131008001,如果查到,就取右边三位,转换成数字再+1,再转换成三位字符串,再和S20131008连到一起。
--如果改公司该类型不存在这种自动编号,系统自动添加这种规则 IF NOT EXISTS(SELECT 1 FROM Saas_SMAUTO_1 WHERE ShortCode =@ShortCode AND AID =@AID) begin --动态增加规则 exec ( 'insert into Saas_SMAUTO_1(AID,ShortCode,ADATE,ALENGTH,VGUID,ANEXTNO) select '''+@AID+''','''+@ShortCode+''',''YY`YYMMDD'',3,newid(),1' ) end SELECT @AUTONO=ISNULL(AID,''), --获取AID @ADATE=ADATE, --获取日期格式 @ALENGTH=ALENGTH, --获取流水号长度 @ANEXTNO=ANEXTNO, --获取下一编号 @ALASTTADE=ALASTDATE FROM Saas_SMAUTO_1 WHERE AID=@AID and ShortCode=@ShortCode --定义时间格式 DECLARE @DATEPART VARCHAR(10) SET @DATEPART=CONVERT(VARCHAR(10),GETDATE(),120) SET @DATEPART=CASE @ADATE WHEN 'YYMM' THEN SUBSTRING(@DATEPART,3,2)+SUBSTRING(@DATEPART,6,2) WHEN 'YYYYMM' THEN SUBSTRING(@DATEPART,1,4)+SUBSTRING(@DATEPART,6,2) WHEN 'YY' THEN SUBSTRING(@DATEPART,3,2) WHEN 'YYYY' THEN SUBSTRING(@DATEPART,1,4) WHEN 'YYMMDD' THEN SUBSTRING(@DATEPART,3,2)+SUBSTRING(@DATEPART,6,2)+RIGHT(@DATEPART,2) WHEN 'YY`YYMMDD' THEN SUBSTRING(@DATEPART,1,4)+SUBSTRING(@DATEPART,6,2)+RIGHT(@DATEPART,2) ELSE '' END --AUTONO =前缀+时间格式 SET @AUTONO=@AUTONO+@DATEPART
DECLARE @NEXTNO VARCHAR(30) IF(@DATEPART='' OR @DATEPART=@ALASTTADE) BEGIN --获取流水号 SET @NEXTNO=CONVERT(VARCHAR(30),@ANEXTNO) SET @NEXTNO=REPLICATE('0',@ALENGTH-LEN(@NEXTNO))+@NEXTNO --增加下一编号 UPDATE Saas_SMAUTO_1 SET ANEXTNO=ANEXTNO+1 WHERE AID=@AID and ShortCode=@ShortCode END ELSE BEGIN --获取流水号 SET @NEXTNO=REPLICATE('0',@ALENGTH-1)+'1' --增加下一编号 UPDATE Saas_SMAUTO_1 SET ANEXTNO=2,ALASTDATE=@DATEPART WHERE AID=@AID and ShortCode=@ShortCode END SET @AUTONO=@AUTONO+@NEXTNO END go 3.调用存储过程 declare @a varchar(50) exec SP_Saas_SMAUTO'','H' ,@a output select @a 4.测试结果 S20131008001S20131009001
生成方式可以用数据库来生成或是由程序来生成。
先生成一个字符串“S+年月日”,今天就是S20131008,再在表中查询“select max(序列号) 序列号 from 表 where 序列号 like 'S20131008%'”,看有没有查询到结果,如果没查到,就用S20131008001,如果查到,就取右边三位,转换成数字再+1,再转换成三位字符串,再和S20131008连到一起。
给你一个存储过程:
1.首先创建一张表:
CREATE TABLE [dbo].[Saas_SMAUTO_1](
[AID] [varchar](50) NOT NULL,
[ADESC] [varchar](50) NULL,
[ADESCCHS] [varchar](50) NULL,
[ShortCode] [varchar](50) NULL,
[ADATE] [varchar](50) NULL,
[ALENGTH] [int] NULL,
[ANEXTNO] [int] NULL,
[ALASTDATE] [varchar](50) NULL,
[VGUID] [uniqueidentifier] NOT NULL,
[VCRTTIME] [datetime] NULL,
[VCRTUSER] [varchar](50) NULL,
[VMDTIME] [datetime] NULL,
[VMDUSER] [varchar](50) NULL,
[VSTATUS] [varchar](50) NULL,
[VLOCK] [varchar](50) NULL,
[VLOCKTIME] [datetime] NULL
)
2.创建存储过程:
create PROCEDURE [dbo].[SP_Saas_SMAUTO]
@ShortCode VARCHAR(50), --缩写码
@AID VARCHAR(20), --自动编号类型
@AUTONO VARCHAR(30) OUTPUT --输出编号
AS
BEGIN
DECLARE
@ADATE VARCHAR(20), --时间类型
@ALENGTH INT, --流水号长度
@ANEXTNO INT, --下一编号
@ALASTTADE VARCHAR(8)
--如果改公司该类型不存在这种自动编号,系统自动添加这种规则
IF NOT EXISTS(SELECT 1 FROM Saas_SMAUTO_1 WHERE ShortCode =@ShortCode AND AID =@AID)
begin
--动态增加规则
exec
(
'insert into Saas_SMAUTO_1(AID,ShortCode,ADATE,ALENGTH,VGUID,ANEXTNO)
select '''+@AID+''','''+@ShortCode+''',''YY`YYMMDD'',3,newid(),1'
)
end
SELECT
@AUTONO=ISNULL(AID,''), --获取AID
@ADATE=ADATE, --获取日期格式
@ALENGTH=ALENGTH, --获取流水号长度
@ANEXTNO=ANEXTNO, --获取下一编号
@ALASTTADE=ALASTDATE
FROM Saas_SMAUTO_1
WHERE
AID=@AID
and ShortCode=@ShortCode
--定义时间格式
DECLARE @DATEPART VARCHAR(10)
SET @DATEPART=CONVERT(VARCHAR(10),GETDATE(),120)
SET @DATEPART=CASE @ADATE
WHEN 'YYMM' THEN SUBSTRING(@DATEPART,3,2)+SUBSTRING(@DATEPART,6,2)
WHEN 'YYYYMM' THEN SUBSTRING(@DATEPART,1,4)+SUBSTRING(@DATEPART,6,2)
WHEN 'YY' THEN SUBSTRING(@DATEPART,3,2)
WHEN 'YYYY' THEN SUBSTRING(@DATEPART,1,4)
WHEN 'YYMMDD' THEN SUBSTRING(@DATEPART,3,2)+SUBSTRING(@DATEPART,6,2)+RIGHT(@DATEPART,2)
WHEN 'YY`YYMMDD' THEN SUBSTRING(@DATEPART,1,4)+SUBSTRING(@DATEPART,6,2)+RIGHT(@DATEPART,2)
ELSE ''
END
--AUTONO =前缀+时间格式
SET @AUTONO=@AUTONO+@DATEPART
DECLARE @NEXTNO VARCHAR(30)
IF(@DATEPART='' OR @DATEPART=@ALASTTADE)
BEGIN
--获取流水号
SET @NEXTNO=CONVERT(VARCHAR(30),@ANEXTNO)
SET @NEXTNO=REPLICATE('0',@ALENGTH-LEN(@NEXTNO))+@NEXTNO
--增加下一编号
UPDATE Saas_SMAUTO_1 SET ANEXTNO=ANEXTNO+1
WHERE
AID=@AID
and ShortCode=@ShortCode
END
ELSE
BEGIN
--获取流水号
SET @NEXTNO=REPLICATE('0',@ALENGTH-1)+'1'
--增加下一编号
UPDATE Saas_SMAUTO_1 SET ANEXTNO=2,ALASTDATE=@DATEPART
WHERE
AID=@AID
and ShortCode=@ShortCode
END
SET @AUTONO=@AUTONO+@NEXTNO
END
go
3.调用存储过程
declare @a varchar(50)
exec SP_Saas_SMAUTO'','H' ,@a output
select @a
4.测试结果
S20131008001S20131009001
http://jimshu.blog.51cto.com/3171847/1176067
可以参考这篇文章的例子