1. 程式人生 > >sql server 按照日期自動生成單據編號的函式

sql server 按照日期自動生成單據編號的函式

None.gif--按單號和年月獲取單據的編號
None.gif
CREATEFUNCTION GetCostBillID(@headStrnvarchar(10),@datedatetime)
None.gif
RETURNSnvarchar(50)
None.gif
BEGIN
None.gif
declare@oid2nvarchar(50)
None.gif
declare@oidnvarchar(50)
None.gif
declare@monthnvarchar(2)
None.gif
declare@yearnvarchar(2)
None.gif
declare@ymnvarchar(4)
None.gif
set@month=month(@date)
None.gif
iflen(@month)=1
None.gif    
set@month='0'+@month--使月為兩位長
None.gif
set@year=right(convert

(nvarchar,year(@date)),2)
None.gif
set@ym=@year+@month--組成年月字元
None.gif

None.gif
--格式CB0808001
None.gif
ifexists(select*from CostBill)
None.gif
begin
None.gif    
selecttop1@oid2=CostBillID from CostBill orderby id desc--獲取最後一條的單據編號,一定要有id,並且自動生成的,倒排序
None.gif
end
None.gif
else
None.gif
begin
None.gif    
set@oid2=@headStr+@ym+'0000'--沒有記錄是預設為今天
None.gif
end
None.gif
None.gif
--訂單不是本月的,重新開始一個新的訂單流水號
None.gif
ifconvert(nvarchar,left(@oid2,6))
<>@headStr+@ym
None.gif
begin
None.gif
--用本月的年月號開始
None.gif
set@oid2=@headStr+@ym+'0000'
None.gif
end
None.gif
None.gif
declare@strnvarchar(50) --臨時單號
None.gif

None.gif
set@str=convert(nvarchar,(convert(int,right(@oid2,4))+1)) --訂單號加一
None.gif
while (4-len(@str)>0)
None.gif
begin
None.gif     
set@str='0'+@str    
None.gif
end
None.gif
set@oid2=@headStr+@ym+@str
None.gif
--print @oid2
None.gif

None.gif
--如果該訂單好已經存在,則重新獲取
None.gif
whileexists(select*from CostBill
where CostBillID=@oid2)
None.gif
begin
None.gif    
None.gif    
set@str=convert(nvarchar,(convert(int,right(@oid2,4))+1)) --訂單號加一
None.gif
while (4-len(@str)>0)
None.gif    
begin
None.gif         
set@str='0'+@str    
None.gif    
end
None.gif    
set@oid2=@headStr+@ym+@str
None.gif
--     print @oid2
None.gif
end
None.gif
None.gif
set@oid=convert(nvarchar,@oid2)
None.gif
--print 'HP'+convert(nvarchar,year(getdate()))+convert(nvarchar,month(getdate()))+@str
None.gif

None.gif
RETURN@oid
None.gif
END
None.gif
   /*--------------------------------------測試--------------------------------------*/
create table CostBill
(
id int Identity not null,
CostBillID VARCHAR(15) PRIMARY KEY DEFAULT dbo.GetCostBillID('HP',getdate()),
COL int
)

INSERT CostBill(col) VALUES(1)
INSERT CostBill(col) VALUES(2)
INSERT CostBill(col) VALUES(3)
INSERT CostBill(col) VALUES(4)

select * from CostBill

/*
       1 HP08060001 1
       2 HP08060002 1
        3 HP08060002 1
        4 HP08060002 1

*/