代码之家  ›  专栏  ›  技术社区  ›  The Scientific Method

如何在SQL Server(或ASP.NET)中为引用ID[重复]创建或生成此模式

  •  -1
  • The Scientific Method  · 技术社区  · 6 年前

    我必须创建引用id,它具有以下模式并将其存储在 在里面 referenceID 列在 tblReferences 桌子

    第一个月

       H01C01001L  
       H01C01002L 
       ...
       H01C01102L
    

    一个月后这种模式重复出现,

      H01C02001L  
      H01C02002L 
       ...
      H01C02102L
    

    第三个月:

      H01C03001L  
      H01C03002L 
       ...
      H01C03102L
    

    H01 C ,和 L 不会改变的

    模式中序列的上限未知,但它将在 200 400 一个月后

    我是新来的SQL数据库,任何建议是赞赏的。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Andrey Nikolov user3098458    6 年前

    你可以用 sequences 为了达到这个目的。只需创建一个以第一个号码开头的新号码:

    CREATE SEQUENCE dbo.NumbersSequence AS INT START WITH 1001 INCREMENT BY 1; 
    

    当需要生成新的引用ID时,从序列中获取下一个编号,并将其格式化以匹配您的模式:

    declare @number int
    select @number = NEXT VALUE FOR dbo.NumbersSequence;
    select CONCAT('N01C', FORMAT(@number, 'D5'), 'L')
    

    当需要更改将生成的下一个值(即下个月)时,请更改序列:

    ALTER SEQUENCE dbo.NumbersSequence RESTART WITH 2001;
    
        2
  •  1
  •   George Menoutis    6 年前

    下面是我的方法。我假设一个源表名为 sourcetable ,具有名为 datefield 以下内容:

    insert into tblReferences (referenceID,...(other cols)...)
        select
            'H01C'
            +convert(char(2),q2.monthindex)
            +convert(char(3),row_number() over (partition by q2.monthindex order by s.datefield asc))
            +'L' as referenceID,
            ...(other cols)...
    from sourcetable s
    cross join (select min(s2.datefield) as firstdate from sourcetable s2)q1  -- gets first date to compare others
    cross apply(select datediff(month,q1.firstdate ,s.datefield as monthindex)q2 -- gets month difference between first and current
    

    您可以在不使用第一行(插入)的情况下运行查询,以确保它生成所需的内容。正如其他人所评论的,这在一年内都不会起作用,返回的值像h01c1301l等等。