sql自动生成流水号

创建表

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server 中生成流水号可以使用自增列或者序列。 1. 自增列 自增列是一种特殊列,它会自动递增并分配唯一的值。在创建表时可以使用 IDENTITY 属性来定义自增列: ```sql CREATE TABLE MyTable ( ID INT IDENTITY(1,1) PRIMARY KEY, Name VARCHAR(50) ); ``` 上面的代码创建了一个名为 MyTable 的表,其中包含一个自增列 ID 和一个名称列 Name。IDENTITY(1,1) 指定 ID 从 1 开始递增,每次递增的步长为 1。 要插入数据时,可以省略自增列的值,数据库会自动分配一个唯一的值: ```sql INSERT INTO MyTable (Name) VALUES ('John'); INSERT INTO MyTable (Name) VALUES ('Mary'); ``` 2. 序列 序列是一种对象,它按照指定的步长递增并生成唯一的值。在 SQL Server 2012 及以上版本中可以使用序列来生成流水号。 首先需要创建一个序列: ```sql CREATE SEQUENCE MySequence START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 1000000; ``` 上面的代码创建了一个名为 MySequence 的序列,它从 1 开始递增,每次递增的步长为 1,最小值为 1,最大值为 1000000。 要获取序列的下一个值,可以使用 NEXT VALUE FOR 函数: ```sql SELECT NEXT VALUE FOR MySequence; ``` 每次执行上面的语句都会返回序列的下一个值。 要插入数据时,可以使用序列的下一个值: ```sql INSERT INTO MyTable (ID, Name) VALUES (NEXT VALUE FOR MySequence, 'John'); INSERT INTO MyTable (ID, Name) VALUES (NEXT VALUE FOR MySequence, 'Mary'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值