现有一订单表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]