不懂樓主意思,關系圖的類型在數據表中已有體現嘛

解决方案 »

  1.   

    --也不是很清楚,给这个你参考/* 添加了部分注释 */
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[udf_GenLevelPath]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[udf_GenLevelPath]
    GOcreate function udf_GenLevelPath()
    returns @v_Result table (LevelPath int,OName sysname)
    /****************************************************************/
    /* 功能描述:按照依赖关系,列出数据库对象 */
    /* 输入参数:无 */
    /* 输出参数:按照依赖关系排列的数据库对象表,无依赖的在前 */
    /* 编写:记得是安安吧       */
    /* 时间:2003-9-9 */
    /****************************************************************/
    as
    begin
    declare @vt_ObjDepPath table (LevelPath int,OName sysname null)
    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)
    select @vi_LevelPath,o.name
    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--调用方法
    select * from dbo.udf_GenLevelPath()
    go