sql自动生成流水号

创建表

1
2
3
4
5
6
7
8
9
CREATE TABLE CreateSerialNo
(
    CreateSerialNoId  INT PRIMARY KEY IDENTITY(1,1),
    TableName  VARCHAR (60),
    FixedCharacter    VARCHAR (20), --FixedCharacter
    LatestDate  VARCHAR (8),
    MaxSerialNo  INT ,
    DataVersion  timestamp
)

  

创建存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
-- =============================================
-- 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

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
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

  

 

posted @   白泽^  阅读(232)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示