實(shí)現(xiàn)的流水號(hào)樣式(字符+日期+流水號(hào))如下
一般自己在寫小demo的時(shí)候,都是使用的純數(shù)字自增(1,2,3……)這種违施。相比而言互纯,流水號(hào)形式的看起來(lái)更正規(guī),而且可以從流水號(hào)中了解數(shù)據(jù)的添加時(shí)間及順序磕蒲,當(dāng)然留潦,是不是看著更有逼格。
目前我采用的方法是辣往,利用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)(可能還有很多方法)兔院,因?yàn)檫@種一般是在插入數(shù)據(jù)的時(shí)候使用,所以把插入數(shù)據(jù)的操作也放在了存儲(chǔ)過(guò)程站削。如果目前不知道存儲(chǔ)過(guò)程這個(gè)概念的小白坊萝,可以看我這篇的介紹第一次接觸存儲(chǔ)過(guò)程
<h3>分析</h3>
該字段由三部分組成:QQ字符 + 201706(年月,即當(dāng)前日期)+ 0001(流水號(hào)钻哩,自動(dòng)增長(zhǎng))
- QQ字符不用管
- 201706屹堰,當(dāng)然是先獲取到系統(tǒng)當(dāng)前的時(shí)間,然后拿到對(duì)應(yīng)的6位數(shù)值
- 流水號(hào)街氢,為了確保主鍵不重復(fù)扯键,同一時(shí)間內(nèi),這部分流水號(hào)應(yīng)該是不同的珊肃,所以流水號(hào)從 0000~9999 荣刑,即同一段時(shí)間最多會(huì)有一萬(wàn)個(gè)不同的流水號(hào)。(目前不考慮9999加1之后的情況)
<h3>實(shí)現(xiàn)</h3>
首先建立一個(gè)test表伦乔,方便講解
create table test(
pk_id varchar(12) not null,
name varchar(10) null
)
實(shí)現(xiàn)201706的前一步(拿到當(dāng)前的年月)
CONVERT(varchar(8), GETDATE(), 112) --獲取對(duì)應(yīng)格式(20170601)的當(dāng)前系統(tǒng)時(shí)間
實(shí)現(xiàn)201706厉亏,同時(shí)把得到的值賦值給一個(gè)變量(為了代碼看起來(lái)清晰)
declare @dateStr varchar(6) --定義變量
----使用substring()方法截取前6位,同時(shí)賦值變量
select @dateStr = (select SUBSTRING((Select CONVERT(varchar(8), GETDATE(), 112)),1,6))
實(shí)現(xiàn)0001的前一步(這里假設(shè)表中已經(jīng)存在一條數(shù)據(jù)烈和,那么它的4位流水號(hào)應(yīng)該是0000爱只,完整代碼部分中會(huì)考慮第一條數(shù)據(jù)的問題。拿到最近生產(chǎn)的4位流水號(hào)招刹,新的流水號(hào)是在此基礎(chǔ)上得到)
----拿到上一個(gè)最近生成的pk_id
select top 1 pk_id from table test order by pk_id desc
實(shí)現(xiàn)0001恬试,這只是開始
declare @maxNo varchar(4) ----定義變量
----把上訴得到的最近生產(chǎn)的pk_id窝趣,通過(guò)substring()方法截取最后的4位流水號(hào),然后對(duì)其加1
select @maxNo=(Select SUBSTRING( (select top 1 pk_id from test order by pk_id desc),9,4)+1);
雖然新生成了一個(gè)流水號(hào)训柴,但是不能直接使用哑舒,因?yàn)槿绻鸃maxNo的值不是4位數(shù),那么就會(huì)擾亂pk_id的隊(duì)形幻馁,所以需要進(jìn)行判斷
if (@maxNo < 10) begin
set @maxNo = '000' + @maxNo; --如果是1位數(shù)的話洗鸵,需要在前面加3個(gè)0,補(bǔ)夠4位
end
else if (@maxNo < 100) begin
set @maxNo = '00' + @maxNo; --如果是2位數(shù)的話仗嗦,需要在前面加2個(gè)0膘滨,補(bǔ)夠4位
end
else if (@maxNo < 1000) begin
set @maxNo = '0' + @maxNo; --如果是3位數(shù)的話,需要在前面加1個(gè)0儒将,補(bǔ)夠4位
end
至此吏祸,分割的各個(gè)部分都實(shí)現(xiàn)了。為了便于插入操作钩蚊,把所有值結(jié)合起來(lái)贡翘,用一個(gè)新的變量來(lái)存儲(chǔ)
declare @result nvarchar(12)--共計(jì)12位,前兩位為QQ砰逻,中間6位是年月鸣驱,最后4位是流水號(hào)
----把之前得到的@dateStr和maxNo加上,QQ字符直接加上即可
select @result=(Select 'QQ' + @dateStr + @maxNo);
最后蝠咆,把需要插入表中的數(shù)據(jù)作為參數(shù)傳遞到存儲(chǔ)過(guò)程中踊东,在存儲(chǔ)過(guò)程中執(zhí)行插入操作
@name -- 需要插入test表中的值
insert into test(pk_id,name) values(@result,@name)
這就是完整的過(guò)程,在執(zhí)行插入數(shù)據(jù)的操作時(shí)刚操,把除了pk_id之外的字段當(dāng)做參數(shù)傳入到存儲(chǔ)過(guò)程中闸翅,在存儲(chǔ)過(guò)程中執(zhí)行insert操作即可
完整的存儲(chǔ)過(guò)程代碼如下
USE [Test] ----Test是test表所在的數(shù)據(jù)庫(kù)名
GO
/****** Object: StoredProcedure [dbo].[AddData] Script Date: 06/01/2017 18:51:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[AddData]
@name varchar(10) ----參數(shù),用于接收傳入的name值
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @dateStr varchar(6), ----定義變量,用于存儲(chǔ)6位數(shù)的時(shí)間
@maxNo varchar(4), ----定義變量菊霜,用于存儲(chǔ)4位流水號(hào)
@result varchar(12) -----定義變量坚冀,用于存儲(chǔ)新生成的pk_id
----獲取到系統(tǒng)當(dāng)前時(shí)間,并截取符合條件的6位鉴逞,同時(shí)賦值給@dateStr
select @dateStr = (select SUBSTRING((Select CONVERT(varchar(8), GETDATE(), 112)),1,6))
----先判斷是否第一次向test表中插入數(shù)據(jù)(即當(dāng)前表中是否存在數(shù)據(jù))
if exists (select * from test) begin
----獲取數(shù)據(jù)表中最近產(chǎn)生的一個(gè)pk_id记某,并截取最后4位流水號(hào),對(duì)4位流水號(hào)進(jìn)行加1构捡,最后賦值給@maxNo
select @maxNo=(Select SUBSTRING( (select top 1 pk_id from test order by pk_id desc),9,4)+1);
----對(duì)上訴的@maxNo做判斷液南,確保流水號(hào)一定是4位,不夠的在前面補(bǔ)0
if (@maxNo < 10) begin
set @maxNo = '000' + @maxNo; --如果是1位數(shù)的話勾徽,需要在前面加3個(gè)0滑凉,補(bǔ)夠4位
end
else if (@maxNo < 100) begin
set @maxNo = '00' + @maxNo; --如果是2位數(shù)的話,需要在前面加2個(gè)0,補(bǔ)夠4位
end
else if (@maxNo < 1000) begin
set @maxNo = '0' + @maxNo; --如果是3位數(shù)的話譬涡,需要在前面加1個(gè)0闪幽,補(bǔ)夠4位
end
----將上訴結(jié)果合成一個(gè)新的pk_id
select @result=(Select 'QQ' + @dateStr + @maxNo)
end
else
----如實(shí)當(dāng)前插入的數(shù)據(jù)時(shí)第一條數(shù)據(jù)啥辨,那么直接把4位流水號(hào)設(shè)為0000
select @result = 'QQ' + @dateStr + '0000'
----將數(shù)據(jù)插入到test表中
insert into test(pk_id,name) values(@result,@name);
END