sql自动生成流水号

该文章展示了如何使用SQL创建一个用于生成流水号的表`CreateSerialNo`以及一个名为`GetSerialNo_DoMethod`的存储过程。这个过程考虑了日期是否包含在流水号中、流水号的位数和自增规则,确保在同一日期内的流水号唯一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建表

CREATE TABLE CreateSerialNo
(
    CreateSerialNoId INT PRIMARY KEY IDENTITY(1,1),
    TableName VARCHAR(60),
    FixedCharacter   VARCHAR(20),--FixedCharacter
    LatestDate VARCHAR(8),
    MaxSerialNo INT ,
    DataVersion timestamp
)

创建存储过程

-- =============================================
-- Author:    <HK0272>
-- Create date: <2023/03/13>
-- Description:  <自动生成流水号>
-- =============================================
CREATE PROCEDURE [dbo].[GetSerialNo_DoMethod] 
@SerialNo nvarchar(100)='' output,
@TableName varchar(100),--表名
@FixedCharacter VARCHAR(20),  --固定字符
@PadLeft INT,    --流水号位数
@ShowDate BIT, --1加年月日(A230313001)  0不加年月日(A001)
@RiseTime datetime --传入年月日
AS
BEGIN
 SET NOCOUNT ON;
 BEGIN TRY
     BEGIN TRAN
         --传入时间为空则自动获取当前时间
         IF ISNULL(@RiseTime,'')=''
         BEGIN
            SET @RiseTime=GETDATE()
         END 

         DECLARE @MaxValue INT,
         @DataVersion timestamp,
         @DefaultDateTime VARCHAR(8)

         IF NOT EXISTS(SELECT 1 FROM CreateSerialNo  WHERE TableName=@TableName AND FixedCharacter=@FixedCharacter)
         BEGIN
            INSERT INTO CreateSerialNo
                (
                    TableName,
                    FixedCharacter,
                    LatestDate,
                    MaxSerialNo
                )
            VALUES 
                (
                    @TableName,
                    @FixedCharacter,
                    CONVERT(VARCHAR(20),@RiseTime,112),
                    1
                )
         END
         ELSE
         BEGIN
            SELECT 
                @DataVersion=DataVersion,
                @DefaultDateTime=LatestDate 
            FROM CreateSerialNo 
            WHERE TableName=@TableName AND FixedCharacter=@FixedCharacter

            --如果不显示日期,不受日期限制,每次自增+1
            IF @ShowDate=0
            BEGIN
                UPDATE CreateSerialNo WITH(ROWLOCK) SET MaxSerialNo=MaxSerialNo+1
                WHERE TableName=@TableName  AND FixedCharacter=@FixedCharacter AND DataVersion=@DataVersion
            END
            ELSE
            BEGIN
                --如果在同一天,流水叫已,否则更新日期并重置最大流水号
                IF @DefaultDateTime=CONVERT(VARCHAR(12),@RiseTime,112)
                BEGIN
                    UPDATE CreateSerialNo WITH(ROWLOCK) SET MaxSerialNo=MaxSerialNo+1
                    WHERE TableName=@TableName  AND FixedCharacter=@FixedCharacter AND DataVersion=@DataVersion
                END
                ELSE
                BEGIN
                    UPDATE CreateSerialNo WITH(ROWLOCK) SET LatestDate=CONVERT(VARCHAR(12),@RiseTime,112),MaxSerialNo=1
                    WHERE TableName=@TableName  AND FixedCharacter=@FixedCharacter AND DataVersion=@DataVersion
                END
            END
        END
        SELECT 
            @SerialNo=FixedCharacter+(CASE @ShowDate WHEN 1 THEN RIGHT(LatestDate,6) ELSE '' END)+(RIGHT(replicate('0',@PadLeft)+CAST(MaxSerialNo AS VARCHAR(10)),@PadLeft))
        FROM CreateSerialNo WITH(XLOCK,PAGLOCK) 
        WHERE TableName=@TableName  AND FixedCharacter=@FixedCharacter
        
        
    COMMIT TRAN
 END TRY
 BEGIN CATCH
    ROLLBACK TRAN
 END CATCH
 return 0
END

调用

declare @SerialNo nvarchar(50)=''
declare @InspectDate datetime=getdate()
--获取编号
exec GetSerialNo_DoMethod 
    @SerialNo=@SerialNo output,
    @TableName='TestTableName',--表名
    @FixedCharacter='', --固定字符
    @PadLeft=3,   --流水号位数
    @ShowDate=1,   --是否包含时间 1:是(A230313001)0:否(A001)
    @RiseTime=@InspectDate--生成时间,为空默认抓当前时间
    
select @SerialNo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值