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
根据自己提供的前缀,和设置序列码的长度依次生成 前缀+日期+序列码长度(号)
先贴代码:
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
相关文章推荐
- SQL存储过程生成流水号
- 用mysql的存储过程实现生成唯一订单号
- 一个用来生成流水号的存储过程
- mysql存储过程生成订单号
- 通过存储过程解决并发生成唯一订单号
- SQL Server 存储过程生成流水号
- Oracle 存储过程删除和新增序列解决流水号每天重新开始
- 实用的银行转账存储过程和流水号生成存储过程
- 根据日期+顺序号生成流水号的存储过程
- 一个用来生成流水号的存储过程
- 存储过程生成流水号----灵活版
- SQL存储过程生成流水号
- 存储过程生成流水号
- 一个生成订单流水号的存储过程
- SQLserver 存储过程生成任意进制/顺序流水号
- SQLServer 生成还原数据库脚本的存储过程!
- 几个收藏的根据数据库生成Insert语句的存储过程[修正版]
- 存储过程生成数据表的insert脚本(转)
- Linq调用存储过程自动生成Int结果集的解决方法