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

经过几个小时的折腾,写出一个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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值