写一个Update语句,将新增的记录的CNo字段更新为如下格式:
CNo-YYYY-Sugar-123(YYYY表示4位的年)如原表中的数据如下:
ID  CNo
1   CNo-2011-Sugar-001
2   CNo-2011-Sugar-002
3   CNo-2011-Sugar-003
……………………………
……………………………
……………………………
……………………………
……………………………
……………………………
121 CNo-2011-Sugar-121
122 CNo-2011-Sugar-122原表中ID是序号,自动生成的,但是CNo中最后的数字可能会和ID不同,比如删掉一条数据再新加时,ID就会变成124,而CNo还是CNo-2011-Sugar-123我知知道CNo生成的前面怎么写,后面的那个数字是找表里最后的那条CNo,然后取到它最后的数字,再加上1,这个应该怎么写呢?Update dbo.ContractDetail set ContractNo=(select 'CNo-'+ left(CONVERT(varchar(100), GETDATE(), 112),4)+ '-'+'Sugar'+'-'+……)请教大家,谢谢!

解决方案 »

  1.   


    Update dbo.ContractDetail 
    set ContractNo=(select 'CNo-'+ left(CONVERT(varchar(100), GETDATE(), 112),4)+ '-'+'Sugar'+'-'+right(10000+id,3))--不要用max(id) + 1 插入后修改下。
      

  2.   


    不是ID啊,是CNO最大的那个加1
      

  3.   


    --以下代码生成的编号长度为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
    --*/
      

  4.   


    --下面的代码生成长度为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
    --*/
      

  5.   


    --生成流水号--创建测试表
    create table test(id varchar(18),  --流水号,日期(8位)+时间(4位)+流水号(4位)
        name varchar(10)  --其他字段
    )go
    --创建生成流水号的触发器
    create trigger t_insert on test
    INSTEAD OF insert
    as
    declare @id varchar(18),@id1 int,@head varchar(12)
    select * into #tb from inserted
    set @head=convert(varchar,getdate(),112)+replace(convert(varchar(5),getdate(),108),':','')
    select @id=max(id) from test where id like @head+'%'
    if @id is null
        set @id1=0
    else
        set @id1=cast(substring(@id,13,4) as int)
    update #tb set @id1=@id1+1
        ,id=@head+right('0000'+cast(@id1 as varchar),4)
    insert into test select * from #tb
    go
    --插入数据,进行测试
    insert into test(name)
    select 'aa'
    union all select 'bb'
    union all select 'cc'--修改系统时间,再插入数据测试一次
    insert into test(name)
    select 'aa'
    union all select 'bb'
    union all select 'cc'--显示测试结果
    select * from test
    --删除测试环境
    drop table test/*--测试结果
    id                 name       
    ------------------ ---------- 
    2004022720430001   aa
    2004022720430002   bb
    2004022720430003   cc
    2004022720430004   aa
    2004022720430005   bb
    2004022720430006   cc(所影响的行数为 6 行)
    --*/
      

  6.   

    Update ContractDetail 
    set ContractNo='CNo-'+ rtrim(year(getdate()))+ '-'+'Sugar'+'-'+rtrim((select count(1) from ContractDetail)+1)
      

  7.   


    CREATE FUNCTION f_NextCno()
    RETURNS varchar(30)
    AS
    BEGIN
        RETURN(SELECT 'CNo-'+ left(CONVERT(varchar(100), GETDATE(), 112),4)+ '-'+'Sugar'+'-'+RIGHT(1000001+ISNULL(RIGHT(MAX(cno),3),0),3) FROM tb WITH(XLOCK,PAGLOCK))
    END
    GO--在表中应用函数
    CREATE TABLE tb
    (
    id int identity(1,1),
    cno varchar(30),
    ar varchar(10)
    )insert into tb(cno,ar) select dbo.f_nextcno(),'a'
    insert into tb(cno,ar) select dbo.f_nextcno(),'b'
    delete from tb where ar = 'b'
    insert into tb(cno,ar) select dbo.f_nextcno(),'d'select *
    from tb
    order by iddrop function f_nextcno
    drop table tb
    /*
    id          cno                            ar
    ----------- ------------------------------ ----------
    1           CNo-2011-Sugar-001             a
    3           CNo-2011-Sugar-002             d(2 行受影响)
      

  8.   

    select 'CNo-'+ left(CONVERT(varchar(100), GETDATE(), 112),4)+ '-'+'Sugar'+'-'+rtrim((select right(max(CNo),len(max(CNo))-14) from ContractDetail) +1)) 搞定!
    谢谢!