凯锐

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  96 随笔 :: 39 文章 :: 212 评论 :: 23 引用

 在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



 

posted on 2006-06-06 16:52 凯锐 阅读(91) 评论(0)  编辑 收藏 网摘 所属分类: SQL Programing

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: