您的位置:首页 > 其它

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

2013-08-04 18:43 423 查看
经过几个小时的折腾,写出一个SQL生成序列号,流水号的存储过程。

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

先贴代码:

USE [TEST]
GO
/****** Object: StoredProcedure [dbo].[GetSerialNo] Script Date: 08/04/2013 18:38:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: leungs
-- Create date: 2013-8-2
-- Description: generation serializer number
-- =============================================
ALTER PROCEDURE [dbo].[GetSerialNo]
@prefix varchar(10)
AS
BEGIN
DECLARE @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)
BEGIN
SET @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);
END
ELSE
BEGIN
WHILE(@i<@length)
BEGIN
SET @lastNo = @lastNo + '0';
SET @i = @i + 1;
END
SET @i = 0;
END
IF(CONVERT(INT,@lastNo)>0)
BEGIN
SET @number = CONVERT(INT,SUBSTRING(@lastNo,LEN(@lastNo)-@length+1,@length))+1;--得到流水号
END
ELSE
BEGIN
SET @number = 1;
END
DECLARE @temp int; SET @temp = 10; --临时变量用于循环处理
--取最后一条数据的最后一个数字
WHILE (@i<@length)
BEGIN
IF(@number*10>@temp-1)
BEGIN
SET @lastNo = SUBSTRING(@lastNo,1,LEN(@lastNo)-1);
END
SET @temp = @temp * 10; --每循环一次*10
SET @i = @i + 1; --更新索引值
END --END WHILE
--犹豫上面循环@temp最后一次多*10 所以要做处理掉再对比
IF(@number>@temp/10-1)
BEGIN
SELECT '当前前缀的订单已满' AS [Message];
END
ELSE
BEGIN
SET @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;
END
END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: