建一个函数,一个视图。
create view bbb
returns varchar(15)
as
select getdate() as dd
Go
create function aaa
AS
declare @id varchar(15),@date datetime
select @date=dd from dbo.bbb
select @id=isnull(max(id),0)+1 from 表 where substring(id,3,8)=convert(varchar(8),@date,112)
return @id
Go
--然在把dbo.aaa填到表中ID的默认里就行了!

解决方案 »

  1.   

    --不好意思,returns放错地方了!
    建一个函数,一个视图。
    create view bbb
    as
    select getdate() as dd
    Go
    create function aaa
    returns varchar(15)
    AS
    declare @id varchar(15),@date datetime
    select @date=dd from dbo.bbb
    select @id=isnull(max(id),0)+1 from 表 where substring(id,3,8)=convert(varchar(8),@date,112)
    return @id
    Go
    --然在把dbo.aaa填到表中ID的默认里就行了!
      

  2.   

    给你一个类似的
    CREATE PROCEDURE proc_NewRegCode 
      @NewCode Varchar(14) OutPut
    AS
    declare @CODE Varchar(10)
    DECLARE @MAXNO VARCHAR(14)SELECT @CODE='aa'+subSTRing(STR(Year(GETDATE()),4),1,4)
      +subSTRing(STR(100+month(GETDATE()),3),2,3)+subSTRing(STR(100+day(GETDATE()),3),2,3)SELECT @MAXNO=MAX(CODE) FROM tablename WHERE CODE LIKE @CODE+'%'
    IF @MAXNO IS NULL
    BEGIN
      SELECT @NEWCODE=@CODE+'0001'
    end
    Else
    BEGIN
     SELECT @NEWCODE=@CODE+subSTRing(STR(10000+CONVERT(INT,SUBSTRING(@MAXNO,11,4))+1,5),2,4)
    END
      insert into tablename (Code) values (@NEWCODE)  select @NewCode=@NewCode
    GO
      

  3.   

    --类似下面这样--自已做标识列的例子--流水号:日期+当日编号:--创建得到最大id的函数
    create function f_getid()
    returns varchar(12)
    as
    begin
    declare @id varchar(12),@dt varchar(8)
    select @dt=dt from v_getdate
    select @id=max(id) from tb where id like @dt+'-%'
    if @id is null
    set @id=@dt+'-'+'001'
    else
    set @id=@dt+'-'+right('000'+cast(cast(right(@id,3) as int)+1 as varchar),3)
    return(@id)
    end
    go--创建表
    create table tb(id varchar(20) default dbo.f_getid() primary key,name varchar(10))
    go--创建视图,得到当前日期(因为函数中不能使用getdate())
    create view v_getdate as select dt=convert(varchar,getdate(),112)
    go
    --插入记录测试
    insert into tb(name) values('张三')
    insert into tb(name) values('张四')
    insert into tb(name) values('张五')
    insert into tb(name) values('张六')
    insert into tb(name) values('张七')
    insert into tb(name) values('张八')
    insert into tb(name) values('张九')
    insert into tb(name) values('张十')--显示插入的结果
    select * from tb
    go
    --删除环境
    drop table tb
    drop view v_getdate
    drop function f_getid
      

  4.   

    --下面是针对楼主要求的数据格式做的一个例子--自已做标识列的例子--流水号:日期+当日编号:--创建得到最大id的函数
    create function f_getid()
    returns varchar(14)
    as
    begin
    declare @id varchar(14),@dt varchar(8)
    select @dt=dt from v_getdate
    select @id=max(id) from tb where id like 'aa'+@dt+'%'
    if @id is null
    set @id='aa'+@dt+'0001'
    else
    set @id='aa'+@dt+right('0000'+cast(cast(right(@id,4) as int)+1 as varchar),4)
    return(@id)
    end
    go--创建表
    create table tb(id varchar(20) default dbo.f_getid() primary key,name varchar(10))
    go--创建视图,得到当前日期(因为函数中不能使用getdate())
    create view v_getdate as select dt=convert(varchar,getdate(),112)
    go
    --插入记录测试
    insert into tb(name) values('张三')
    insert into tb(name) values('张四')
    insert into tb(name) values('张五')
    insert into tb(name) values('张六')--修改系统日期,再次插入记录
    insert into tb(name) values('张七')
    insert into tb(name) values('张八')
    insert into tb(name) values('张九')
    insert into tb(name) values('张十')--显示插入的结果
    select * from tb
    go
    --删除环境
    drop table tb
    drop view v_getdate
    drop function f_getid
      

  5.   

    晕,忘了处理:
    declare @id varchar(15),@date datetime
    select @date=dd from dbo.bbb
    select @id=isnull(cast(right(max(id),5) as int),0)+1 from 表 where substring(id,3,8)=convert(varchar(8),@date,112)
    set @id='aa'+convert(varchar(8),@date,112)+right('00000'+@id,5)
    return @id
    Go
      

  6.   

    我想得用个单独的处理过程才能实现(包括触发器方式)'字母' + '日期值' + '计数值'
    例子;
    create table Test
    (
    nIndex int identity(1,1),
    cId char(14) not null 
    )
    go   过程部分代码:
    declare @nCount int,
    @cId varchar(20) set @cId = 'aa' + datename(yy,getdate()) + datename(mm,getdate()) + datename(dd,getdate())
    select @nCount = count(1) from Test where cId like @cId +'%'
    set @cId = @cId + left('0000',4-len(@nCount)) + convert(varchar(4),@nCount + 1)
    insert into test (cid) values(@cId)
      

  7.   

    select 'aa'+cast(cast(datename(yyyy,getdate())+datename(mm,getdate())+datename(dd,getdate())+'0001' as decimal)+1 as char(12))
    也能取得顺号
      

  8.   

    我到做过订单流水号的函数,大概思路如下:
    流水号的编号规则:年+月+日+编号,中间不含‘-’
    每次生成编号前,先将当前日期值(年月日)转换成连接的字符串(注意一位数月份前补0),然后写sql语句,用模糊查询的方法搜索,条件是你生成的字符串包含在编号字段里,打开数据库(执行open),获取rs.recordcount的值,如果为0则说明,你要添加的是第一条(比如编号为:"年月日001"),否则,编号为:"年月日"&"00"&rs.recordcount+1
    方法可能有点苯,多读了一次数据库,不过很简单实用。
      

  9.   

    哦,补充一下,楼上的 sailer_shi 朋友用存储过程来实现更好,效率很高,我没有仔细看,思路应该差不多。