挖土

Coding for fun.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

获得当前数据库中对象的依赖关系的算法

Posted on 2005-08-28 23:14  挖土.  阅读(261)  评论(0)    收藏  举报

create function udf_GenLevelPath_Table()
 returns @v_Result table (LevelPath int,OName sysname,type varchar(8))

as
begin
 declare @vt_ObjDepPath table (LevelPath int,OName sysname null, type Varchar(8))
 declare @vt_Temp1 table (OName sysname null)
 declare @vt_Temp2 table (OName sysname null)
 declare @vi_LevelPath int

 set @vi_LevelPath = 1
 insert into @vt_ObjDepPath(LevelPath,OName,type)
  select @vi_LevelPath,o.name,o.type
   from sysobjects o
   where xtype not in ('S','X')
 
 insert into @vt_Temp1(OName)
  select distinct object_name(sysdepends.depid)
   from sysdepends,@vt_ObjDepPath p
   where sysdepends.id <> sysdepends.depid
    and p.OName = object_name(sysdepends.id)
 
 while (select count(*) from @vt_Temp1) > 0
 begin
  set @vi_LevelPath = @vi_LevelPath + 1
 
  update @vt_ObjDepPath
   set LevelPath = @vi_LevelPath
   where OName in (select OName from @vt_Temp1)
    and LevelPath = @vi_LevelPath - 1
 
  delete from @vt_Temp2
 
  insert into @vt_Temp2
   select * from @vt_Temp1
 
  delete from @vt_Temp1
 
  insert into @vt_Temp1(OName)
   select distinct object_name(sysdepends.depid)
    from sysdepends,@vt_Temp2 t2
    where t2.OName = object_name(sysdepends.id)
     and sysdepends.id <> sysdepends.depid

 end

 select @vi_LevelPath = max(LevelPath) from @vt_ObjDepPath

 update @vt_ObjDepPath
  set LevelPath = @vi_LevelPath + 1
  where OName not in (select distinct object_name(sysdepends.id) from sysdepends)
   and LevelPath = 1
 
 insert into @v_Result
  select * from @vt_ObjDepPath order by LevelPath desc
 return
end
go