分享C#原生ID(流水号)生成功能实现

摘要:
您还可以修改上述存储过程以生成符合您要求的序列号

一、非存储过程生成的流水号

   /// <summary>
    /// 
    /// </summary>
    public static class DataBaseGenerator
    {
        /// <summary>
        /// 
        /// </summary>
        private static Int64 seed = Int64.Parse(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds.ToString("0"));

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static Int64 GetPrimaryKey()
        {
            return Interlocked.Increment(ref seed);
        }
    }

二、存储过程生成流水号
1,首先在数据库中创建一个存放流水号的表

CREATE TABLE [dbo].[NumSeq] (
    [Cate] [varchar] (2)  NOT NULL ,
    [DateNo] [varchar] (4)  NOT NULL ,
    [Seq] [int] NULL ,
    [CrTime] [datetime] NOT NULL 
)

上面的代码中,Cate 字段为流水号的头,可以在下面的存储过程中用参数的方式传入,我的定义是2个字符,这个可以根据具体需要更改 
            DateNo 字段为获取日期信息 
            Seq 字段为流水号,但最终生成的流水号是这三个字段的相加 

2,创建存储过程

CREATE  PROC dpPMT_SGetMaintainSeq
@MaintainCate VARCHAR(2)

AS
--***********************累加编号*************************************************
DECLARE @MaintainNo VARCHAR(12) 
IF NOT EXISTS(SELECT 
            *
        FROM
            NumSeq
        WHERE
            Cate=@MaintainCate AND DATEDIFF(DAY,CrTime,GETDATE())=0)
    BEGIN
        INSERT INTO 
            NumSeq(Cate,DateNo,Seq)
        values(@MaintainCate,RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+
                REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())),0)

    END
ELSE
    BEGIN
        UPDATE
            NumSeq
        SET 
            Seq=Seq+1
        WHERE
            Cate=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+
                       REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE()))
    END

--************************组合编号***************************************************************
SELECT 
    @MaintainNo=Cate+DateNo+REPLICATE('0',6-LEN(Seq))+CONVERT(VARCHAR(6),Seq)
FROM
    NumSeq
WHERE
    Cate=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+
                      REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE()))

SELECT @MaintainNo

这个存储过程最终输出的结果如:AA071031000001 前面两位是传入的参数,中间四位是年份的后两位和月,最后的六位为6位数字的流水号。您也可以修改上面的存储过程来生成符合您要求的流水号

免责声明:文章转载自《分享C#原生ID(流水号)生成功能实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇hdu 4651 Partition (利用五边形定理求解切割数)maven的目录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

项目字典表设计

系统字典表,一半涉及两张表:字典1:n字典项。是一对多的关系 字典表: 字典项表: 如,消息类型,在字典表就是 在字典项对应的多条: 字典表sql: CREATE TABLE `sys_dict` ( `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,...

DB2存储过程——参数详解

语法说明1、procedure-name: 存储过程的名字,在同一个数据库的同一模式下,不能存在存储过程名相同参数数目相同的存储过程,即使参数的类型不同也不行。2、(IN | OUT | INOUT parameter-name data-type,...) :传入参数     IN:输入参数OUT:输出参数INOUT:作为输入输出参数parameter...

UTL_FILE详解

包UTL_FILE 提供了在操作系统层面上对文件系统中文件的读写功能。非超级用户在使用包UTL_FILE中任何函数或存储过程前必须由超级用户授予在这个包上的EXECUTE权限。例如:我们使用下列命令对用户mary进行授权: GRANT EXECUTE ON PACKAGE SYS.UTL_FILE TO mary; 如果使用包UTL_FILE中的函数和...

SQL Server Profiler工具

一、SQL Profiler工具简介SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询; 在后台收集查询信息; 分析性能; 诊断像死锁之类的问题; 调试T-SQL语句; 模拟重放SQL Server活动; 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动。这样的活动被称...

MySql 获取当前节点及递归所有上级节点

-- MySql 获取当前节点及递归所有上级节点 -- 参数说明:resultField:查询返回字段,idd 要查询的资源ID值,idFieldName ID字段名,parentIdFieldName 上级ID字段名,tableName 表名,isContainMySelf 是否包含自己 DROP procedure IF EXISTS pro_g...

oracle sqlplus 命令行中创建存储过程

while 循环插入测试数据 1.创建存储过程 create or replace procedure proc_test_while is i number; begin i := 0; while i < 40 loop i := i + 1; insert...