订单编号自动编写

现有一订单表SO_Table,其中订单号字段:RefNO varchar(10), 现在需要实现自动编号,格式为YYYYMMXXXX,其中XXXX为序号。

如:2010040001  2010040002 2010049999,但每次前六位日期变化时要重新编号。采用T-sql实现订单自动编号的思路。

 

create table SO_Table
(
RefNo varchar(10) Not NULL
,RefName varchar(100)
)

 

方法一:

[code=SQL]

alter function f_getRefNo()
returns varchar(10)
as
begin
    
declare @RefNo varchar(10)
    
select @RefNo=Convert(varchar(6),GETDATE(),112)+right(10001+cast(isnull(right(MAX(RefNo),4),0) as int),4)
    
from SO_Table with(xlock)
    
where RefNo like Convert(varchar(6),GETDATE(),112)+'%'
    
return @RefNo
end

create table SO_Table
(
RefNo
varchar(10) Not NULL primary key default dbo.f_getRefNo()
,RefName
varchar(100)
)
insert into SO_Table(RefName)values('aa')
insert into SO_Table(RefName)values('bb')
insert into SO_Table(RefName)values('cc')
delete from SO_Table where RefName='cc'
insert into SO_Table(RefName)values('cc')


--修改系统时间
insert into SO_Table(RefName)values('aa')
insert into SO_Table(RefName)values('bb')
insert into SO_Table(RefName)values('cc')
select * from SO_Table
---------
RefNo    RefName
2011010001    aa
2011010002    bb
2011010003    cc
2011020001    aa
2011020002    bb
2011020003    cc

[/code]

 

方法二:

[code=sql]

--建表
if object_id('SO_Table') IS NOT NULL
   
drop table SO_Table create table SO_Table
(
RefNo
varchar(10) Not NULL
,RefName
varchar(100)
)
--插入一条记录
insert into SO_Table
select '2011010001','wch'

--创建代替insert操作的触发器
if object_id('TRG_InsertSO_Table') IS NOT NULL
   
drop trigger TRG_InsertSO_Table
create trigger TRG_InsertSO_Table
on dbo.SO_Table
instead
of insert
as
insert into SO_Table(RefNo,RefName)
select
(
select convert(varchar(6),getdate(),112)+replace(str((ISNULL(max(cast(substring(RefNo,7,4) as int)),0))+1,4),' ','0')
from SO_Table
where substring(RefNo,1,6)=convert(varchar(6),getdate(),112)) as RefNo
,RefName
from inserted

--测试数据
insert into SO_Table(RefName)
select 'alex'

select * from SO_Table

 

[/code]

 

你可能感兴趣的:(订单编号自动编写)