我要生成订单号,格式为:6位日期+3位当日流水号(下一日就重新按001开始)现在我能通过以下sql生成唯一的单号
DECLARE @NowTime nvarchar(20)
DECLARE @FlowId nvarchar(50)

--生成日期号
SET @NowTime = CONVERT(varchar(100), GETDATE(), 12)--生成流水号
SET @FlowId = (
               SELECT CASE 
                   WHEN exists
                     (SELECT * FROM tb WHERE  @NowTime =substring(f_id,1,6))
                   THEN 
     right('000000'+rtrim(( SELECT isnull(max(right(f_id,3)),0)+1
                                            FROM tb 
                                            WHERE @NowTime=substring(f_id,1,6)))
                                          ,3) 
           ELSE 
     '001' END 
       )但我发现一个问题,如果我删掉最后一条记录后再插入另一条记录,插入的订单号会是刚刚删除的订单号,但我希望是刚刚删除的订单号的下一个号,请问如何解决?

解决方案 »

  1.   

    除非是借助计算列id自增号 用max的肯定不行
      

  2.   

    参考:我想插入数据库一个字段是这样的: 
    ID      PID 
    1        0911200001      当天时间091120+0001 
    2        0911200002      当天时间091120+0002  
    依次类推 
      0911210001      第二天又是取当前时间+0001 
            0911210002      第二天又是取当前时间+0002 
    依次类推 
            0911220001    第二天又是取当前时间+0001 
    ....... 
    这个要怎么实现哦!!!帮帮忙(ID不用管,只求那个编号) 
    -------------------create table tb(ID int IDENTITY,PID varchar(20), PID2 varchar(20))
    gocreate trigger my_trig on tb FOR INSERT
    as
    begin
      declare @cnt as int
      select @cnt = count(1) from tb where pid = (select pid from inserted)
      update tb set pid2 = pid + right('0000'+cast(@cnt as varchar),4) where id = (select id from inserted)
    end
    goinsert into tb(pid) values('091120')
    insert into tb(pid) values('091120')
    insert into tb(pid) values('091121')
    insert into tb(pid) values('091121')select * from tbdrop table tb/*ID          PID                  PID2                 
    ----------- -------------------- -------------------- 
    1           091120               0911200001
    2           091120               0911200002
    3           091121               0911210001
    4           091121               0911210002(所影响的行数为 4 行)
    */
      

  3.   

    你这个删除最后那条记录,再增加还是按个pid呀,我要的pid是0911210003,而不是0911210002
      

  4.   

    代码就不写了
    你自己改一改 或者写个函数作为计算列的值
    CREATE TABLE tb (id INT IDENTITY(1,1),
    id1 AS RIGHT('000000'+RTRIM(id),6),col1 VARCHAR(1))
    INSERT tb SELECT 'a' UNION 
    SELECT 'b'
    DELETE FROM tb WHERE id=2
    INSERT tb SELECT 'c'
    SELECT * FROM tb/*
    id          id1          col1 
    ----------- ------------ ---- 
    1           000001       a
    3           000003       c
    */
      

  5.   


    插入的时候返回自增长ID,和上一次的进行比较,
    如果是相邻的就加1,否则就加上间隔。
    大意是这意思,可能有语法错误,LZ看看能满足不?
    DECLARE @NowTime nvarchar(20)
    DECLARE @FlowId nvarchar(50)--DECLARE @q int  上次的最后的ID--set @q =(select max(id) from tb where 条件(当日))
    --insert ............. --生成日期号
    SET @NowTime = CONVERT(varchar(100), GETDATE(), 12)
    if(@@identity-@q)=1
    --生成流水号
    begin
    SET @FlowId = (
       SELECT CASE 
       WHEN exists
     (SELECT * FROM tb WHERE  @NowTime =substring(f_id,1,6))
       THEN 
     right('000000'+rtrim(( SELECT isnull(max(right(f_id,3)),0)+1
    FROM tb 
    WHERE @NowTime=substring(f_id,1,6)))
      ,3) 
       ELSE 
     '001' END 
       )
    end
    else
    begin
    SET @FlowId = (
       SELECT CASE 
       WHEN exists
     (SELECT * FROM tb WHERE  @NowTime =substring(f_id,1,6))
       THEN 
     right('000000'+rtrim(( SELECT isnull(max(right(f_id,3)),0)+(@@identity-@q)--改动
    FROM tb 
    WHERE @NowTime=substring(f_id,1,6)))
      ,3) 
       ELSE 
     '001' END 
       )
    end