如何实现字母加数字作为主键,并且数字自动增长

解决方案 »

  1.   

    select isnull((select 'N'+'0000000000'+cast(cast(right(max(no),9) as int)+1 as varchar(10)) from tb), 'N000000001')
      

  2.   

    --以下代码生成的编号长度为12,前6位为日期信息,格式为YYMMDD,后6位为流水号。
    --创建得到当前日期的视图
    CREATE VIEW v_GetDate
    AS
    SELECT dt=CONVERT(CHAR(6),GETDATE(),12)
    GO--得到新编号的函数
    CREATE FUNCTION f_NextBH()
    RETURNS char(12)
    AS
    BEGIN
    DECLARE @dt CHAR(6)
    SELECT @dt=dt FROM v_GetDate
    RETURN(
    SELECT @dt+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) 
    FROM tb WITH(XLOCK,PAGLOCK)
    WHERE BH like @dt+'%')
    END
    GO--在表中应用函数
    CREATE TABLE tb(
    BH char(12) PRIMARY KEY DEFAULT dbo.f_NextBH(),
    col int)--插入资料
    INSERT tb(col) VALUES(1)
    INSERT tb(col) VALUES(2)
    INSERT tb(col) VALUES(3)
    DELETE tb WHERE col=3
    INSERT tb(col) VALUES(4)
    INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)--显示结果
    SELECT * FROM tb
    /*--结果
    BH           col 
    ------------------- ----------- 
    050405000001  1
    050405000002  2
    050405000003  4
    050405000004  14
    --*/
      

  3.   

    http://blog.csdn.net/htl258/archive/2009/03/26/4027976.aspx
      

  4.   

    --number is in the format: 'N000000001'
    create function f_getMaxNumber()
    returns varchar(10)
    as
    begin
      declare @no varchar(10)
      select @no=isnull('N'+right((select '000000000'+cast(cast(right(max(no),9) as int)+1 as varchar(10)) from tb),9), 'N000000001')
      return @no
    end
    gocreate table tb(col varchar(3),no varchar(10) default dbo.f_getMaxNumber())
    insert tb(col)
    select 'abc' union all
    select 'sdf' union all
    select 'sdf'select * from tbdrop table tb
    drop function dbo.f_getMaxNumber
    /*
    col  no
    ---- ----------
    abc  N000000001
    sdf  N000000002
    sdf  N000000003
    */
      

  5.   

    实现很容易,考滤的应该是并发性。个人的建议是,用一个表,存储最大编号(只存int值), 这样,每次要增加新记录生成当前主健列值时,先update此维护表中记录值 + 1, 然后直接从此维护表中取出int值再拼成主健, 比起每次从业务表庞大的数据中取max, i/0开销少很多。 再加上事务处理,还可以避免高量并发时多个进程取max 再+1,产生重复主健列值,最后插入时由unique约束限制造成回滚 而产生大量不必要的i/0操作。
      

  6.   

    --(4)生成流水号   
    if object_id('tb') is not null drop table tb   
    drop function dbo.FC_Next   
    create function dbo.FC_Next()   
    returns char(8)   
    as  
    begin   
         return (select 'BH'+right(1000001+isnull(right(max(BH),6),0),6) from tb)   
    end    
    create table tb   
    (   
      BH char(8) primary key default dbo.FC_Next(),   
      col int  
    )   
    select * from tb   
      
    begin tran   
    insert into tb (col) values (1)   
    insert into tb (col) values (2)   
    insert into tb(BH,col) values (dbo.FC_Next(),14)   
    commit tran   
    select * from tb  
      

  7.   

    CREATE TABLE dbo.tb
    (
    flg int NOT NULL IDENTITY (1, 1),
    id  AS 'a'+right('000000'+convert(varchar,flg),6) PERSISTED not null PRIMARY KEY CLUSTERED ,
    col1 nvarchar(50) NOT NULL
    )  ON [PRIMARY]
    GO
      

  8.   

    CREATE TABLE dbo.tb
    (
    flg int NOT NULL IDENTITY (1, 1),
    id  AS 'a'+right('000000'+convert(varchar,flg),6) PERSISTED not null PRIMARY KEY CLUSTERED ,
    col1 nvarchar(50) NOT NULL
    )  ON [PRIMARY]
    GO
    insert into tb(col1) select 'abc' union all select 'def' union all select 'hij'
    select id,col1 from tb
    go
    drop table tb
    /*
    id            col1
    ------------- --------------------------------------------------
    a000001       abc
    a000002       def
    a000003       hij
    */