sql-server - SQL Server 数据库中所有依赖项的树

标签 sql-server database parsing text

我必须维护一个没有文档的旧项目,并且有一个包含大量表、函数和存储过程的数据库。我想在表和存储过程之间建立一个依赖树,例如,这个过程执行这些过程并使用这些表。

  1. 有没有什么工具可以帮到我

  2. 如果没有,此类算法的起点是什么?我的意思是我可以从数据库中获取所有过程的源代码,然后为所有“exec#”、“update #”、“insert into #”等解析它。在这种情况下,解决这个问题的最佳方法是什么(也许是正则表达式,或者一些特殊的算法……)?

最佳答案

Higarian,您的代码对我非常有用。我对其进行了一些改进,以删除循环依赖项、包括表引用并按 ObjectPath 进行排序。

;with ObjectHierarchy ( Base_Object_Id , Base_Cchema_Id , Base_Object_Name , Base_Object_Type, object_id , Schema_Id , Name , Type_Desc , Level , Obj_Path) 
as 
    ( select  so.object_id as Base_Object_Id 
        , so.schema_id as Base_Cchema_Id 
        , so.name as Base_Object_Name 
        , so.type_desc as Base_Object_Type
        , so.object_id as object_id 
        , so.schema_id as Schema_Id 
        , so.name 
        , so.type_desc 
        , 0 as Level 
        , convert ( nvarchar ( 1000 ) , N'/' + so.name ) as Obj_Path 
    from sys.objects so 
        left join sys.sql_expression_dependencies ed on ed.referenced_id = so.object_id 
        left join sys.objects rso on rso.object_id = ed.referencing_id 
    where rso.type is null 
        and so.type in ( 'P', 'V', 'IF', 'FN', 'TF' ) 

    union all 
    select   cp.Base_Object_Id as Base_Object_Id 
        , cp.Base_Cchema_Id 
        , cp.Base_Object_Name 
        , cp.Base_Object_Type
        , so.object_id as object_id 
        , so.schema_id as ID_Schema 
        , so.name 
        , so.type_desc 
        , Level + 1 as Level 
        , convert ( nvarchar ( 1000 ) , cp.Obj_Path + N'/' + so.name ) as Obj_Path 
    from sys.objects so 
        inner join sys.sql_expression_dependencies ed on ed.referenced_id = so.object_id 
        inner join sys.objects rso on rso.object_id = ed.referencing_id 
        inner join ObjectHierarchy as cp on rso.object_id = cp.object_id and rso.object_id <> so.object_id 
    where so.type in ( 'P', 'V', 'IF', 'FN', 'TF', 'U') 
        and ( rso.type is null or rso.type in ( 'P', 'V', 'IF', 'FN', 'TF', 'U' ) ) 
        and cp.Obj_Path not like '%/' + so.name + '/%' )   -- prevent cycles n hierarcy
select   Base_Object_Name 
    , Base_Object_Type
    , REPLICATE ( '   ' , Level ) + Name as Indented_Name 
    , SCHEMA_NAME ( Schema_Id ) + '.' + Name as object_id 
    , Type_Desc as Object_Type 
    , Level 
    , Obj_Path 
from ObjectHierarchy as p 
order by Obj_Path

关于sql-server - SQL Server 数据库中所有依赖项的树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652746/

相关文章:

php - move_uploaded_file 不工作

MongoDB - 手动创建带引用的对象 - DBRef 不起作用

html - "Smart"网站数据的解析和使用方式?

c# - 位字段的 Enum.GetName()?

sql - MS SQL - 一对多关系 - 需要返回单行

sql-server - edge-sql.js 如何设置connectionString?

javascript - 如何使用 node.js 和连接池一次建立到 SQLServer 数据库的多个连接?

sql-server - 来自 Powershell 的 Powershell DBCC CheckDB

php - 使用 PHP 在 MySQL 中创建表时出错

json - 从BeautifulSoup中的JSON对象解析出特定的值