--参考
在学习中遇到这个问题 
数据库里有编号字段 
BH00001 
BH00002 
BH00003 
BH00004 
如何实现自动增长 --下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
    RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)--插入资料
BEGIN TRAN
    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)
COMMIT TRAN--显示结果
SELECT * FROM tb
/*--结果
BH         col 
---------------- ----------- 
BH000001  1
BH000002  2
BH000003  4
BH000004  14
--*/ create table tb
(id int identity,
name varchar(10),
code as 'BH'+right('0000'+cast(id as varchar),5))
go
insert tb(name) select 'A'
union all select 'B'
union all select 'C'
union all select 'D'select * from tbdrop table tb/*
id          name       code         
----------- ---------- ------------ 
1           A          BH00001
2           B          BH00002
3           C          BH00003
4           D          BH00004(所影响的行数为 4 行)
*/

解决方案 »

  1.   


    if object_id('[tab]') is not null drop table [tab]
    create table [tab]([name] varchar(3),[sex] varchar(2),[address] varchar(3))
    insert [tab]
    select 'aaa','男','aaa' union all
    select 'bbb','女','bbb' union all
    select 'ccc','男','ccc' union all
    select 'ddd','女','ddd'select * from [tab]CREATE FUNCTION f_NextBH()
    RETURNS char(12)
    AS
    BEGIN
    declare @i int
    set @i=(select count(*) from tab)
    return 'sj'+right(1000000001+@i,8)
    END
    GO
    alter table tab add tid varchar(20) default  dbo.f_NextBH()
      

  2.   

    create  FUNCTION f_NextBH() 
    RETURNS char(12)
    AS
    BEGIN
        declare @i int
        set @i=(select count(*) from tab )
        return 'sj'+right(convert(varchar,(1000000001+@i)),8)
    END
    GO
    if object_id('[tab]') is not null drop table [tab]
    create table [tab](id varchar(100),[name] varchar(3),[sex] varchar(2),[address] varchar(3))
    go
    insert [tab]
    select dbo.f_NextBH(), 'aaa','男','aaa' union all
    select dbo.f_NextBH(), 'bbb','女','bbb' union all
    select dbo.f_NextBH(), 'ccc','男','ccc' union all
    select dbo.f_NextBH(), 'ddd','女','ddd'
    go
    select * from tab
    /*  
    sj00000001   aaa 男 aaa
    sj00000002   bbb 女 bbb
    sj00000003   ccc 男 ccc
    sj00000004   ddd 女 ddd
      */
    insert tab values(dbo.f_NextBH(), 'eee','女','eee')
    select * from tab
    /*
    sj00000001   aaa 男 aaa
    sj00000002   bbb 女 bbb
    sj00000003   ccc 男 ccc
    sj00000004   ddd 女 ddd
    sj00000005   eee 女 eee
    */
      

  3.   

    引用1楼--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
    --得到新编号的函数
    CREATE FUNCTION f_NextBH()
    RETURNS char(8)
    AS
    BEGIN
        RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
    END
    GO--在表中应用函数
    CREATE TABLE tb(
    BH char(8) DEFAULT dbo.f_NextBH(),
    col varchar(50))--插入资料
    BEGIN TRAN
       
        INSERT tb(BH,col) select  dbo.f_NextBH()as id,name from info
    COMMIT TRAN--显示结果
    SELECT * FROM tb
    其结果怎么会。
    BH000001 宋捷
    BH000001 宣宇
    BH000001 韩银志
    BH000001 施红
    BH000001 严明
    BH000001 沈建平
    BH000001 曾颖群
    BH000001 秦莉
    BH000001 周福俊
    BH000001 杨彩霞
      

  4.   

    三楼也一样sj00000001   aaa 男 aaa
    sj00000001   bbb 女 bbb
    sj00000001   ccc 男 ccc
    sj00000001   ddd 女 ddd怎么也是这种效果
      

  5.   

    create  FUNCTION MaxID() 
    RETURNS char(10)
    AS
    BEGIN
        declare @i int
        set @i=(select count(*) from 原表)
        return 'sj'+right(cast(1000000001+@i as varchar),8)
    ENDinsert 原表 values (MaxID(), 'newrow', '男', 'text')