为了提这个问题。我从18:00等到20:00,
不知道csdn怎么弄的.
明明说好18:00的..

解决方案 »

  1.   

    create  procedure sp_create_projectcode
    ( @No char(12) OutPut)/*输出参数*/
    As--Begin Tran 
    --^^没有改变数据,不用事务
    Declare @us_year char(4)      --请去掉分号
    --                              ^^^^^
    Declare @us_projectcode char(12)
    Declare @ui_projectcode int
    Select @us_year=convert(char(4),datepart(year,getdate()))     --年度
    --              ^^^^
    Select @us_projectcode=max(projectcode) from project--最大值
    IF @us_projectcode is null 
      begin
      set @us_projectcode='00000001'
      Set @ui_projectcode=convert(int,@us_projectcode)+1
      Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode)  if(@@error<>0)
    --^^^这里@@error<>0表示有错误
    --   commit --提交
    --^^没有数据修改不必提交
    --  else
        begin
    --    rollback 
    --^^
        set @No=null--表示取值失败
        end
      End 
    go
      

  2.   

    以上还有一个错误,去掉没用的注释后:create  procedure sp_create_projectcode
    ( @No char(12) OutPut)/*输出参数*/
    AsDeclare @us_year char(4)      --请去掉分号
    Declare @us_projectcode char(12)
    Declare @ui_projectcode int
    Select @us_year=convert(char(4),datepart(year,getdate()))    --年度
    Select @us_projectcode=max(projectcode) from project--最大值IF @us_projectcode is null 
      set @us_projectcode='00000001'Set @ui_projectcode=convert(int,@us_projectcode)+1
    Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode)if(@@error<>0)
        set @No=null --表示取值失败
    go
      

  3.   

    : Haiwer(海阔天空):谢谢你的指点....我取出来的还是空值...
      

  4.   

    执行select max(projectcode) from project结果是什么 
      

  5.   

    我把SET改成SELECT,可以取到编号。如果用SET创建就通不过。是否可以用set给变量赋值,如果可以,我创建储存过程为何通不过,盼解答。
    to:am2000(最后一滴水) 
    如果要控制多用户,用上面的方法是没用的。即使你在取项目编码时,对表进行加锁,但退出时
    没有立即更新表中的最大项目编码。那么在更新表中的最大项目编码之前,另一用户执行上面储存过程和上一用户取到的还是一样的项目编码。
    你可以建一张编号表,存放单前最大编号,取编号时从编号表取,在过程中立即更新编号表单前最大编号。但有一个缺点,不能保证编号会连续。
      

  6.   

    如果只有查询操作,if(@@error<>0)可以不用要。
    要想控制多用户,即使使用表级锁,但存储过程执行完,表级锁将释放,在没有将新得到的项目编号插入之前,如果有另一个用户也执行这个存储过程,就会出现两个相同的项目编号。
    所以建议将取最大编号和插入操作放在同一个存储过程中,并放在一个事务中执行,执行过程中设置表级锁就可以了。
      

  7.   

    哦,真是笨笨...这确实不行。那该怎么办...
    bluepower2008(蓝色力量)的思路也是不行的啊。我觉得。
    我的思路是插入时自动生成编码,这样的话,保存的时候无法实现多用户的。
    有没有比较好的思路?在不改变需求的情况下...
      

  8.   

    TO:am2000(最后一滴水)
    bluepower2008(蓝色力量)的思路当然可行,我现在做的就是照他的思路做成的.万试万灵呀.
      

  9.   

    vfp_database(数据库) 能不能说详细一点...我不懂....给个例子吧...
      

  10.   

    这个问题的最好方案是用触发器,因为触发器本身和插入语句是在一个事务的!
    另外,上次的程序:create  procedure sp_create_projectcode
    ( @No char(12) OutPut)/*输出参数*/
    AsDeclare @us_year char(4)      --请去掉分号
    Declare @us_projectcode char(12)
    Declare @ui_projectcode int
    Select @us_year=convert(char(4),datepart(year,getdate()))    --年度
    Select @us_projectcode=max(projectcode) from project--最大值
    --       ^^^^这里取出的应该带年份
    IF @us_projectcode is null 
      set @us_projectcode='000000000001'Set @ui_projectcode=convert(int,substring(@us_projectcode,5,8)+1
    --                   ^^^应去掉年份Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode)if(@@error<>0)
        set @No=null --表示取值失败
    go
      

  11.   

    看来你原来的程序是错误百出的!create  procedure sp_create_projectcode
    ( @No char(12) OutPut)/*输出参数*/
    AsDeclare @us_year varchar(4)      --请去掉分号
                   --^^
    Declare @us_projectcode char(12)
    Declare @ui_projectcode int
    Select @us_year=convert(char(4),datepart(year,getdate()))    --年度
    Select @us_projectcode=max(projectcode) from project where projectcode like @us_year+'%'
    --      ^^^^这里取出的应该带年份                           加条件考虑换年的情况
    IF @us_projectcode is null 
      set @us_projectcode='000000000001'Set @ui_projectcode=convert(int,substring(@us_projectcode,5,8)+1
    --                  ^^^应去掉年份Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode)if(@@error<>0)
        set @No=null --表示取值失败
    go