SQL語(yǔ)句:select replace(substring(convert(varchar(20),getdate(),120),1,10),‘-‘,‘‘)+cast(MAX(訂單號)+1 as varchar(4))
使用存儲過(guò)程
--創(chuàng )建測試表
create table usertable(userid varchar(20),username nvarchar(20))
go
--創(chuàng )建觸發(fā)器
create trigger tg_insert on usertable
for insert
as
declare @username nvarchar(20)
declare @userid varchar(20)
declare @num int
select @userid=max(userid) from usertable where userid like ‘jzxd‘ + substring(convert(varchar(10),getdate(),112),5,4) + ‘%‘
if @userid is null
set @userid=‘jzxd‘ + substring(convert(varchar(10),getdate(),112),5,4) + ‘-01‘
else
begin
set @num=cast(substring(@userid,10,2) as int)
set @num=@num + 1
if @num<10
set @userid=‘jzxd‘ + substring(convert(varchar(10),getdate(),112),5,4) + ‘-0‘ + cast(@num as varchar(2))
else
set @userid=‘jzxd‘ + substring(convert(varchar(10),getdate(),112),5,4) + ‘-‘ + cast(@num as varchar(2))
end
select @username=username from inserted
rollback
insert into usertable values(@userid,@username)
go
--測試數據
insert into usertable(username) values(‘a(chǎn)a‘)
go
insert into usertable(username) values(‘bb‘)
go
insert into usertable(username) values(‘cc‘)
go
--顯示數據
select * from usertable
go
--try
大多數的單據都需要有個(gè)單據號。有的單據號就是順序編號如:000001,000002……。有的單據號是有一定意義的,如我遇見(jiàn)過(guò)的 一個(gè)需求:?jiǎn)螕柟?2位,1位帳套號(區分使用單位的),1位單據標識號(表示該單是什么單,如:E表示訂貨單,X表示銷(xiāo)售單),2位年號(05表示 2005年),2位月號,2位日號,4位編號(按當天的順序,最大9999,超過(guò)9999的就用9999表示)。JE0505070001就表示某某單位2005年5月7日的第一單訂貨單。用編程實(shí)現這個(gè)要求當然不算太難,不過(guò)要將單據號生成方法放到存儲過(guò)程中去 就要費點(diǎn)心思了。
下面就以插入訂單為例,其中有一段代碼是可提取到一個(gè)單獨的存儲存儲過(guò)程中的,這樣可增加通用性。
-插入客戶(hù)訂單
CREATE PROCEDURE InsertOrder
(
@CustomerId int,
@MX nvarchar(4000),
@Incom smallint
)
AS
SET NOCOUNT ON
--這一個(gè)部分還可單獨提取到一個(gè)存儲過(guò)程中通過(guò)傳入“單據標識號”和“單據表名”為參數---------------------------------------
--找帳套字頭號
DECLARE @IH char(1)
SELECT @IH = LEFT(IncID,1) FROM accounts WHERE ID = @Incom
--編號年月部分
DECLARE @YM char(6)
SET @YM = CONVERT(char(6),GETDATE(),12)
--單據字頭
DECLARE @DJHH char(8)
SET @DJHH = @IH + ‘E‘ + @YM
--找編號的基值(方法:用當天的編號到排序取最大的一個(gè)。如當前最大編號為0001那么它的基值為1,這樣就能得出下個(gè)編號為0002)
DECLARE @MNO INT --當天最大的單據號(數值)
SET @MNO = 1
select TOP 1 @MNO = CONVERT(int,RIGHT(DJH,4))+1 from Orders where left(DJH,8) = @DJHH and incom = @Incom Orders by DJH desc
DECLARE @DJH char(12)
--擴充成4位十進(jìn)制編號(最大可顯示9999)
IF @MNO < 9999
IF @MNO < 999
IF @MNO < 99
IF @MNO < 9
SET @DJH = @DJHH + ‘000‘ + CONVERT(char(1),@MNO)
ELSE
SET @DJH = @DJHH + ‘00‘ + CONVERT(char(2),@MNO)
ELSE
SET @DJH = @DJHH + ‘0‘ + CONVERT(char(3),@MNO)
ELSE
SET @DJH = @DJHH + CONVERT(char(4),@MNO)
ELSE
SET @DJH = @DJHH + ‘9999‘
----(可提取的部分結束)------------------------------------------------------------------------------------------------------
--插入訂單
INSERT INTO Orders (DJH, CustomerId, MX, InCom) VALUES (@DJH, @CustomerId, @MX, @Incom)
RETURN
GO
聯(lián)系客服