【问题标题】:A SQL query to list all stored procedures executed in a parent stored procedure [duplicate]用于列出在父存储过程中执行的所有存储过程的 SQL 查询 [重复]
【发布时间】:2021-01-10 22:12:17
【问题描述】:

我在 Azure SQL 数据库中有多个执行多个存储过程的存储过程。

例如:

CREATE PROCEDURE [DBO].[PARENT] AS
BEGIN
    EXEC [DBO].[CHILD1];
    EXEC [DBO].[CHILD2];
END

我想要做的是编写一个查询,列出我在一个列中拥有的所有父存储过程,在第二列中列出所有调用的子存储过程。

有办法吗?

提前致谢

【问题讨论】:

  • 这能回答你的问题吗? Find all references to an object in an SQL Server database 特别是第二个答案指的是dm_sql_referencing_entities
  • @PeterSmith dm_sql_referencing_entities 没有像我想象的那样工作吗?
  • @PeterSmith OP 使用标准 EXEC 语句,没有动态 sql。请参阅此fiddle 以证明其有效
  • @Charlieface 太好了 - 我在下面 +1,感谢您的澄清

标签: sql sql-server stored-procedures


【解决方案1】:

您可以使用 DMV sys.proceduressys.dm_sql_referencing_entities 获取此信息:

SELECT
    parent = referencing_schema_name + '.' + r.referencing_entity_name,
    child = QUOTENAME(OBJECT_SCHEMA_NAME(child.schema_id)) + '.' + QUOTENAME(child.name)
FROM sys.procedures AS child
JOIN sys.dm_sql_referencing_entities
    (QUOTENAME(OBJECT_SCHEMA_NAME(child.schema_id)) + '.' + QUOTENAME(child.name),
    'OBJECT') AS r;

【讨论】:

    【解决方案2】:

    sp_depends 显示有关数据库对象依赖关系的信息。

    以下示例列出了依赖于dbo.spSample_ProcedureName的过程

    EXEC sp_depends @objname = N'dbo.spSample_ProcedureName';
    

    您可以对sp_depends 进行一些更改并提取您需要的内容。


    我宁愿编辑我的答案,因为我认为这是一个有用的问题。所以我写了一个完整的查询来显示结果。我已经测试了这个查询,它是成功的。

    DECLARE @Res AS TABLE (SP_Names NVARCHAR(776), Dependencies NVARCHAR(MAX))
    
    SELECT [name]
    INTO #t_sp 
    FROM sys.procedures
    
    
     WHILE EXISTS (SELECT [name] FROM #t_sp)
     BEGIN
     
     DECLARE @objname nvarchar(776) = (SELECT TOP(1) [name] FROM #t_sp)
    
     declare @objid int         -- the id of the object we want
     declare @found_some bit            -- flag for dependencies found
     declare @dbname sysname
    
    
    SELECT @dbname = parsename(@objname,3)
    
        if @dbname is not null and @dbname <> db_name()
            begin
                raiserror(15250,-1,-1)
    
            end
    
        --  See if @objname exists.
        select @objid = object_id(@objname)
        if @objid is null
            begin
                select @dbname = db_name()
                raiserror(15009,-1,-1,@objname,@dbname)
    
            end
    
    
    
        --  Now check for things that depend on the object.
        if exists (select *
                from sysdepends
                    where depid = @objid)
        begin
                raiserror(15460,-1,-1)
            INSERT INTO @Res
            (
                SP_Names,
                Dependencies
            )
            
            SELECT  distinct 'name' = (s.name + '.' + o.name), @objname
                --type = substring(v.name, 5, 66)               -- spt_values.name is nvarchar(70)
                    from sys.objects o, master.dbo.spt_values v, sysdepends d,
                        sys.schemas s
                    where o.object_id = d.id
                        and o.type = substring(v.name,1,2) collate catalog_default and v.type = 'O9T'
                        and d.depid = @objid
                        and o.schema_id = s.schema_id
                        and deptype < 2
    
            select @found_some = 1
        end
    
        DELETE #t_sp WHERE [name] = @objname
    
    
    END
    
    
    DROP TABLE #t_sp
    
    SELECT * FROM @Res
    ORDER BY SP_Names
    

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2010-09-15
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      相关资源
      最近更新 更多