數據庫高級查詢設計

/* 

--前提描述,一張flidtab表有5個字段。Fid是主鍵,int類型、主動增長(identity)。cidpidtid是外鍵,int類型、主動增長(identity)。Fidnocidpidtid組合而成,前提cidpidtid不足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
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章