在CSDN上看到的(http://community.csdn.net/Expert/topic/4802/4802557.xml?temp=.4318659)。原問題是﹕
在插入資料的時候,對某一欄位加1,每插入一條資料(船期順序號:)欄位加1
要求:
船期順序號: 船號
MS_0001 A
MS_0002 B
MS_0003 C
MS_0004 D
MS_0005 E
MS_0006 F
。。。。
如果刪除時候,要再把此欄位的順序號能夠連續:例如:船號D和E的記錄刪除。排列如下:
MS_0001 A
MS_0002 B
MS_0003 C
MS_0004 F
。。。。
該問題的解答者LouisXIV(夜游神)給出如下答案﹐我認為很好新意﹐所以將期整理放在這里﹕
--建立一個自增函數
Alter Function dbo.f_NextMS()
Returns Char(7)
As
Begin
Return(Select 'MS_'+RIGHT(100001+IsNull(Right(Max(cqxh),4),0),4) From cq With(Xlock,Paglock))
End
--建立表﹐cqxh列默認值為前面的那個自增函數
create table cq
(
cqxh char(7) default dbo.f_NextMS(),
ch varchar(10)
)
--插入數據測試
insert into cq (ch)
select 'A'
go
insert into cq (ch)
select 'B'
go
insert into cq (ch)
select 'C'
go
insert into cq (ch)
select 'D'
go
insert into cq (ch)
select 'D'
go
insert into cq (ch)
select 'E'
go
insert into cq (ch)
select 'F'
go
--檢測結果
select * from cq
至于刪除后﹐該解答者采用的是一個觸發器﹐這里的新意不是很好﹐但似乎又想不到最好的方法了﹐也貼在這里
create trigger tr_MSDelete
on cq
for delete
as
--建臨時表
create table #temp
(
id int identity(1,1),
ch varchar(10)
)
--將刪除後資料轉移入臨時表中
insert into #temp
select ch
from table1
--清除原表
truncate table cq
--臨時表中資料轉移回原表
insert into table1
(ch)
select ch
from #temp
--缺點是原表資料量很大的時候轉入轉出很浪費資源,量少的話無所謂
--測試如下,
select * from cq
go
delete from cq where ch in ('B','D')
go
select * from cq
go