select isnull(max(right(bh,5)),0)+1 newbh  from tb
where left(bh,2)='13'

解决方案 »

  1.   


    select row_number() over (order by name) as rowid, sysobjects.[name] from sysobjects
    select id=IDENTITY(int,1,1), sysobjects.[name] as name into dbo.Test_Table from sysobjects
      

  2.   

    var
      tempYear,GetValue:string;
      begin
      ckdbh:=FormatDateTime('yymmdd', Now);
      tempyear :=foarmatdatetime('yy',now);// 获得当时的年份
      sqltxt := 'select top 1* from [wzck] order by ckid desc ';
      openadoquery(dmf.ADOQuery7, sqltxt);
      if dmf.ADOQuery7.RecordCount = 1 then
         begin
           getvalue :=trim(copy(dmf.adoquery7.fieldbyname('ckdh').asstring,0,4); //获得最大值的年份
           if getvalue =tempyear then   //当时本年的时候
           begin
             //取出出库单编号,得到后5位的数,加00001,然后和当前日期累加;
            ckdbh:=ckdbh+inttostr(StrToInt(RightStr(dmf.ADOQuery7.FieldByName('ckdh').AsString,5))+00001);
           end
           else //是新年的时候
           begin
              ckdbh:=ckdbh+'00001';
           end;
          end;
        end;
      

  3.   


    在并发性很高的情况系max+1模式就会有问题。oracle里有Sequence可用。sqlserver里虽然没有Sequence,但也有牛人经过改造做出相同的功能。自己连接过去看吧http://www.cnblogs.com/heekui/archive/2008/07/24/1250842.html
      

  4.   

    每次保存或者提交的时候校验一次就可以了吧。呵呵,就是校验和保存提交那么一瞬间,哪怕是0.01毫秒,max值都可能会被别的用户改变
    况且记录数达到百万级别,取max值也是以秒计算的
    这种事,最好交给数据库去做,程序控制不了的。
    oracle里有Sequence就是专门为解决高并发性导致主键冲突而设计的。
      

  5.   

    这个你逻辑说的清楚 ,就那样实现就行了 你有什么困难吗,这个你取出来的ID 的年与系统比对下不对的话就从000001 开始,方法太多 了 如楼上所说这种想唯一的ID, 最好是数据库去做,SQL 自动增长,oracle 用的是序列,你也可以像ORACEL 那样用个表去记录最大值 想不重复就是SELECT 一次MAX +1