表结构
 @t(id  varchar(20))
   GJD-20060712-01-1
   GJD-20060712-01-2
 ...........即字符串'GJD'+'-'+当天日期+'-'+部门编号+'-'+'递增编号'能不能直接在SQL中实现,不写函数

解决方案 »

  1.   

    declare @t table(id varchar(20))
    declare @d1 varchar(2),@d2 varchar(2)
    set @d1='01'
    set @d2='02'insert into @t 
    select 'GJD-'+convert(char(8),getdate(),108)+'-'+@d1+'-'+rtrim(isnull(left(max(id),1),0)+1)
    from @t where id like 'GJD-'+convert(char(8),getdate(),108)+'-'+@d1+'-%'insert into @t 
    select 'GJD-'+convert(char(8),getdate(),108)+'-'+@d1+'-'+rtrim(isnull(left(max(id),1),0)+1)
    from @t where id like 'GJD-'+convert(char(8),getdate(),108)+'-'+@d1+'-%'insert into @t 
    select 'GJD-'+convert(char(8),getdate(),108)+'-'+@d2+'-'+rtrim(isnull(left(max(id),1),0)+1)
    from @t where id like 'GJD-'+convert(char(8),getdate(),108)+'-'+@d2+'-%'
      

  2.   

    不写函数,而把个SQL写得老长,这个有必要吗?我也来写一写!
      

  3.   

    declare @t table(id varchar(20))
    declare @d1 varchar(2),@d2 varchar(2)
    set @d1='01'
    --set @d2='02'insert into @t 
    select 'GJD-'+convert(char(8),getdate(),112)+'-'+@d1+'-'+rtrim(isnull(left(max(id),1),0)+1)
    from @t where id like 'GJD-'+convert(char(8),getdate(),112)+'-'+@d1+'-%'select * from  @t
    /*GJD-20060712-01-1
    */
    --如果是01部门的话,GJD-20060712-01-1怎样在插入记录的时候递增
      

  4.   


    insert int @t
    select 'GJD-' +  convert(varchar(8),getdate(),112)  + '-' + (select 部门编号 from tab where ..)
     + cast((select max(right(id , 1)) + 1 from tab ) as  varchar(20))
      

  5.   

    建议使用配置关系来解决。可以设置一个部门分类表,不同类型部门使用相同或不同的取号范围。取号使用取号表来记录。可以写存储过程来进行取号。取号表有部门类型作为主键区分号码段。部门类型不一定是一个字段。可以使用多个字段。这样可以通过后台配置来实现自动取号。而存储过程是不要改变的。用我们现在项目中的实际使用举例:报价单、订单、出货单等是不同的CLASS,不同的CLASS又区分总公司和分公司以及出货退货等。以这些作为取号表的主键,将号码分段处理,只要写一个存储过程即可。而程序中取号方法也只使用一个就可以了。
      

  6.   

    这是取号部分的存储过程。希望可以有所帮助。IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'SD_GetAutoDocNum')
    BEGIN
    PRINT 'Dropping Procedure SD_GetAutoDocNum'
    DROP  Procedure  SD_GetAutoDocNum
    ENDGOPRINT 'Creating Procedure SD_GetAutoDocNum'
    GO
    CREATE Procedure SD_GetAutoDocNum
    /* Param List */
    @CLASS char(10),
    @OBJECT char(4),
    @SECTIONOBJECT char(4),
    @COUNT int
    ASDeclare 
    @DocID decimal(18,0),  -- 要返回的号码@BEGINCOUNT decimal(18), -- 起始号码
    @ENDCOUNT decimal(18), -- 终止号码
    @CURRENTCOUNT VARCHAR(18),   -- 以字符串形式存储的当前号码
    @EXTEBS char(1)    -- 内外部给号标志Set @DocID = -1; -- 初始化返回号码If (@COUNT <= 0) -- 判断传入的取号个数不正确
    Begin
    Goto real_end -- 取号个数不正确,直接返回
    End
    SELECT 
    @DocID = 0,
    @BEGINCOUNT = CAST(BEGINCOUNT AS decimal(18,0)),
    @ENDCOUNT = CAST(ENDCOUNT AS decimal(18,0)),
    @CURRENTCOUNT = CURRENTCOUNT
    FROM BSNRG WHERE CLASS=@CLASS AND OBJECT=@OBJECT AND SECTIONOBJECT=@SECTIONOBJECTif (@DocID = -1)
    Begin
    Goto real_end
    End-- 为数据库加锁,避免并发时取到重复的号
    UPDATE BSNRG SET CURRENTCOUNT = @CURRENTCOUNT WHERE CLASS=@CLASS AND OBJECT=@OBJECT AND SECTIONOBJECT=@SECTIONOBJECT-- 如果初始化数据库时将当前号码值0的话即可删除此部分
    If ( (@CURRENTCOUNT IS NULL) OR (@CURRENTCOUNT = '') ) -- 第一次给号
    Begin
    Set @DocID = @BEGINCOUNT + @COUNT - 1;
    UPDATE BSNRG SET CURRENTCOUNT = @DocID WHERE CLASS=@CLASS AND OBJECT=@OBJECT AND SECTIONOBJECT=@SECTIONOBJECT;
    Set @DocID = @DocID - @COUNT + 1; -- 返回产生的第一个号码
    EndElse -- 在已产生号码的基础上自动累加号码
    Begin
    Set @DocID = CAST(@CURRENTCOUNT AS decimal(18,0)) + @COUNT;
    If (@DocID > @ENDCOUNT) -- 判断产生的号码是否已超出给号范围
    Begin
    Set @DocID = -1;
    End
    Else
    Begin
    UPDATE BSNRG Set CURRENTCOUNT = @DocID WHERE CLASS=@CLASS AND OBJECT=@OBJECT AND SECTIONOBJECT=@SECTIONOBJECT;
    Set @DocID = @DocID - @COUNT + 1; -- 返回产生的第一个号码
    End
    Endreal_end:If (@DocID = -1)
    Begin
    Select 'ERROR'
    End
    Else
    Begin
    Select @DocID
    EndGO
    -- 设置存储过程执行权限
    GRANT EXEC ON SD_GetAutoDocNum TO PUBLICGO
      

  7.   

    select 'GJD-'+convert(char(8),getdate(),112)+'-'+'01'+ cast(identity(int) as varchar(4000))
      

  8.   

    --------------------------------------------------------------
    您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
    您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
    http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选复选的90位数据库工程师将与您展开积极的互动。
    一方面,他们会为您的问题提供满意的答案,
    另一方面,也邀请您为他们投上宝贵的选票。2006-7-8 ~ 2006-7-25日,每天我们将从当天参与"有奖投票"的网友
    中抽取3名幸运者,赠送由IBM提供的精美礼品一份!此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
    http://www.bestdba.cn/match_discussion3.aspx?pointid=146&pointid2=1&agains=1&pointid3=5非常感谢您对本次活动的支持!
    --------------------------------------------------------------