在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 
。。。。

如果刪除時候,要再把此欄位的順序號能夠連續:例如:船號DE的記錄刪除。排列如下:
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



 

相关文章:

  • 2022-12-23
  • 2021-07-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-18
  • 2021-05-01
猜你喜欢
  • 2022-12-23
  • 2021-08-18
  • 2021-08-11
  • 2022-12-23
  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
相关资源
相似解决方案