当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 获得当前数据库对象依赖关系的实用算法

MSSQL
SQL Server:小编浅谈视图的认识与原理
SQL Server各种日期计算方法之二
SQL Server各种日期计算方法之一
Sql Server中的日期与时间函数
SQL Server不能启动的常见故障[1][1]
如何将SQL Server中的表变成txt 文件
SQL Server不存在或访问被拒绝 Windows里的一个bug
探讨SQL Server 2005的评价函数
SQL Server 2000数据库升级到SQL Server 2005的最快速
实现删除主表数据时, 判断与之关联的外键表是否有数据
SELECT 赋值与ORDER BY冲突的问题
无法在 SQL Server 2005 Manger Studio 中录入中文的
如何快速生成100万不重复的8位编号
精华:精妙SQL语句
SQL Server导出导入数据方法
MS SQL SERVER 的一些有用日期
怎样用SQL 2000 生成XML
当SQL Server数据库崩溃时如何恢复
SQL Server查询语句的使用
SQL Server 中易混淆的数据类型

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 121 ::
收藏到网摘: n/a

本文主要介绍了一个获得当前数据库对象依赖关系的实用算法,具体示例请大家参考下文:

以下为引用的内容:
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