查看: 5648|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2009-1-9 15:12:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
本文主要介绍了一个获得当前数据库对象依赖关系的实用算法,具体示例请大家参考下文:

以下为引用的内容:
create   function   udf_GenLevelPath()   
  returns   @v_Result   table   (LevelPath   int,OName   sysname)   
  /****************************************************************/   
  /* 功能描述:按照依赖关系,列出数据库对象 */   
  /* 输入参数:无 */   
  /* 输出参数:按照依赖关系排列的数据库对象表,无依赖在前 */   
  /* 编写: anna*/   
  /* 时间:2007-12-12 */   
  /****************************************************************/   
  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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表