SLQ生成订单号 序列码 流水号的存储过程

来源:互联网 发布:node.js高级编程 编辑:程序博客网 时间:2024/06/06 21:48

经过几个小时的折腾,写出一个SQL生成序列号,流水号的存储过程。

根据自己提供的前缀,和设置序列码的长度依次生成 前缀+日期+序列码长度(号)

先贴代码:

USE [TEST]GO/****** Object:  StoredProcedure [dbo].[GetSerialNo]    Script Date: 08/04/2013 18:38:25 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:leungs-- Create date: 2013-8-2-- Description:generation serializer number  -- =============================================ALTER PROCEDURE [dbo].[GetSerialNo] @prefix varchar(10)ASBEGINDECLARE @length int; SET @length = 4; --需要生产的流水号位数DECLARE @lastNo varchar(30); SET @lastNo = '' --存贮最后一条数据DECLARE @number int; --保存当前数DECLARE @i int; SET @i= 0; --遍历所用索引SELECT @number = COUNT(*) FROM TBSerialNo WHERE SUBSTRING(SerialNo,1+LEN(@prefix),LEN(CONVERT(VARCHAR(12),GETDATE(),112)))=CONVERT(VARCHAR(12),GETDATE(),112) AND SERIALNO LIKE @prefix+SUBSTRING(SerialNo,LEN(@prefix)+1,LEN(SerialNo)-LEN(@prefix)-@length)+'%';IF(@number<>0)BEGINSET @lastNo = (SELECT TOP 1 SerialNo FROM (SELECT SerialNo,SUBSTRING(SerialNo,(LEN(@prefix)+LEN(SerialNo)-LEN(@prefix)+1)-@length,@length) AS Sort from TBSerialNo WHERE SERIALNO LIKE @prefix+SUBSTRING(SerialNo,LEN(@prefix)+1,LEN(SerialNo)-LEN(@prefix)-@length)+'%' ) T ORDER BY Sort DESC)SET @lastNo = SUBSTRING(@lastNo,LEN(@lastNo)-@length+1,@length);ENDELSEBEGINWHILE(@i<@length)BEGINSET @lastNo = @lastNo + '0';SET @i = @i + 1;ENDSET @i = 0;ENDIF(CONVERT(INT,@lastNo)>0)BEGINSET @number = CONVERT(INT,SUBSTRING(@lastNo,LEN(@lastNo)-@length+1,@length))+1;--得到流水号ENDELSEBEGINSET @number = 1;ENDDECLARE @temp int; SET @temp = 10; --临时变量用于循环处理--取最后一条数据的最后一个数字WHILE (@i<@length)BEGINIF(@number*10>@temp-1)BEGINSET @lastNo = SUBSTRING(@lastNo,1,LEN(@lastNo)-1);ENDSET @temp = @temp * 10; --每循环一次*10SET @i = @i + 1; --更新索引值END--END WHILE--犹豫上面循环@temp最后一次多*10 所以要做处理掉再对比IF(@number>@temp/10-1)BEGINSELECT '当前前缀的订单已满' AS [Message];ENDELSEBEGINSET @lastNo = @prefix+CONVERT(VARCHAR(12),GETDATE(),112)+ @lastNo + CONVERT(VARCHAR(10),@number);INSERT INTO dbo.TBSerialNo(SerialNo) VALUES (@lastNo);SELECT '' AS [Message],@lastNo AS SerialNo;ENDEND


原创粉丝点击