/*
--前提描述,一張flidtab表有5個字段。Fid是主鍵,int類型、主動增長(identity)。cid、pid、tid是外鍵,int類型、主動增長(identity)。Fidno由cid、pid、tid組合而成,前提cid、pid、tid不足5位的添加成5位長度。用sql批量實現。
*/
--創建表
create table flidTab
(
fid int primary key identity(1,1),
fidno varchar(21) not null,
cid int not null,
pid int not null,
tid int not null
)
go
--插入數據
insert flidtab
select '123123',1,1,1
union all select 'qwe',2,3,3
union all select 'asd',3,3,1
union all select 'zXc',2,3,1
go
select * from flidtab
go
--建造用於填充位數的id
--判斷cId長度
create proc BuildcId
@inputId int ,
@outputId varchar(5) output
as
select @outputId = cid from flidtab where fid = @inputId
--判斷長度
if(len(@outputId)=2)
begin
set @outputId = '000'+@outputId
end
else if(len(@outputId)=3)
begin
set @outputId = '00'+@outputId
end
else if(len(@outputId)=4)
begin
set @outputId = '0'+@outputId
end
else if(len(@outputId)=1)
begin
set @outputId = '0000'+@outputId
end
else
begin
set @outputId =''
end
go
--判斷pId長度
create proc BuildpId
@inputId int ,
@outputId varchar(5) output
as
select @outputId = pid from flidtab where fid = @inputId
--判斷長度
if(len(@outputId)=2)
begin
set @outputId = '000'+@outputId
end
else if(len(@outputId)=3)
begin
set @outputId = '00'+@outputId
end
else if(len(@outputId)=4)
begin
set @outputId = '0'+@outputId
end
else if(len(@outputId)=1)
begin
set @outputId = '0000'+@outputId
end
else
begin
set @outputId =''
end
go
--判斷tId長度
create proc BuildtId
@inputId int ,
@outputId varchar(5) output
as
select @outputId = tid from flidtab where fid = @inputId
--判斷長度
if(len(@outputId)=2)
begin
set @outputId = '000'+@outputId
end
else if(len(@outputId)=3)
begin
set @outputId = '00'+@outputId
end
else if(len(@outputId)=4)
begin
set @outputId = '0'+@outputId
end
else if(len(@outputId)=1)
begin
set @outputId = '0000'+@outputId
end
else
begin
set @outputId =''
end
go
--測試
declare @out varchar(5)
exec buildpid 1, @out output
print '---------'+@out
go
-- 創建修改存儲過程
create proc prc_updateFidNo
@id int
as
declare @cid varchar(5),
@pid varchar(5),
@tid varchar(5),
@fidno varchar(30)
exec buildcid @id, @cid output
exec buildpid @id, @pid output
exec buildtid @id, @tid output
select @fidno = (select fidno from flidTab where fid = f.fid) from flidTab as f
select @fidno =@fidno + '_'+@cid+ '_'+@pid+ '_'+@tid from flidTab as f where f.fid=1
print '---------========='+@fidno
--修改數據
update flidTab set fidno = @fidno
where fid = @id
go
--測試
exec prc_updateFidNo 1
go
select * from flidtab
go
--聲明只讀遊標
declare findfidNo cursor for
select fid from flidTab
for read only
--打開遊標
open findfidno
--執行
declare @fid int
fetch next from findfidno into @fid
while(@@fetch_status=0)
begin
exec prc_updateFidNo @fid --執行修改
fetch next from findfidno into @fid
end
go
--關閉遊標
close findfidNo
deallocate findfidNo
go
--查看測試結果
select * from flidtab
go