--
自已做標識列的例子,不自動重排編號,而是自動補號:
--建立得到最大id的函式
create
function
f_getid()
returns
char(3
)asbegin
declare
@idint
ifnot
exists
(select
1from
tb whereid=
'001')
set@id=1
else
begin
select
@id=
max(id)
from
tbif
@idis
null
set@id=1
else
begin
declare
@id1
intselect
@id1
=min
(id)
from
tb a
where
id<>
@idand
notexists
(select
1from
tb whereid=
a.id+1
)if@id1
isnot
null
set@id
=@id1
set@id
=@id+1
endend
return
(right('
000'
+cast
(@id
asvarchar),3
))end
go--
建立表create
table
tb(id
char(3
) primary
keydefault
dbo.f_getid(),name
varchar(10
))go
--插入記錄測試
insert
into
tb(name)
values('
張三')insert
into
tb(name)
values('
張四')insert
into
tb(name)
values('
張五')insert
into
tb(name)
values('
張六')insert
into
tb(name)
values('
張七')insert
into
tb(name)
values('
張八')insert
into
tb(name)
values('
張九')insert
into
tb(name)
values('
張十')--
顯示插入的結果
select
*from
tb--
刪除部分記錄
delete
from
tb where
name in(
'張三',
'張七',
'張八',
'張十')
--顯示刪除後的結果
select
*from
tb--
再次插入記錄
insert
into
tb(name)
values('
李一')insert
into
tb(name)
values('
李二')--
顯示插入的結果
select
*from
tb order
byid
go--
刪除環境
drop
table
tbdrop
function
f_getid
/*--測試結果
id name
---- ----------
001 李一
002 張四
003 張五
004 張六
005 李二
007 張九
(所影響的行數為 6 行)
--*/
另外一種計算缺號的演算法
---最小
--select min(b+1) as lostnum from a where (not ((b+1) in (select b from a)))
select
min(a+1
) as
lostnum
from
t where
(not
((a+1)
in(select
a from
t)))
---最大
--select max(b-1) as lostnum from a where (not ((b-1) in (select b from a)))
select
max(a-1
) as
lostnum
from
t where
(not
((a-1)
in(select
a from
t)))
SQL自動生成流水號
select convert char 6 getdate 12 下面的 生成長度為8的編號,編號以bh開頭,其餘6位為流水號。得到新編號的函式 create function f nextbh returns char 8 asbegin 從表裡得到最大值加個1000001就增乙個1 return...
通過SQL自動新增流水號
專案中往往有一些單據流水號或者流程流水號是希望通過新增一條記錄後自動產生乙個編號的,比如新增一條流程就自動根據當前日期自動新增該流程的流程流水號,下面介紹兩種不同型別流水號通過sql自動產生的方法。流水號格式 第一種 數值型別 日期 流水號,比如 201104190001 201104190002 ...
自動生成業務單據流水號方案
我們在開發管理軟體的時候,常常遇到流水號 單據號 登記號 自動生成 控制和管理的問題。由於流水號 具有唯一性和連續性的特點,在實際開發過程中若處理不好,會產生流水號重複及斷號的問題。特別是多個併發用 戶同時儲存一張同樣的業務單據時,系統會返回多個相同的流水號。筆者以前在開發企業erp系統的時候,就曾...