Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列出父存储过程中执行的所有存储过程的SQL查询_Sql_Sql Server_Stored Procedures - Fatal编程技术网

列出父存储过程中执行的所有存储过程的SQL查询

列出父存储过程中执行的所有存储过程的SQL查询,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我在Azure SQL数据库中有多个存储过程,它们执行多个存储过程 例如: CREATE PROCEDURE [DBO].[PARENT] AS BEGIN EXEC [DBO].[CHILD1]; EXEC [DBO].[CHILD2]; END 我要做的是编写一个查询,在一列中列出所有父存储过程,在第二列中列出所有调用的子存储过程 有没有办法做到这一点 提前感谢sp_dependens显示有关数据库对象依赖关系的信息 以下示例列出了依赖于dbo.spSample\u Pro

我在Azure SQL数据库中有多个存储过程,它们执行多个存储过程

例如:

CREATE PROCEDURE [DBO].[PARENT] AS
BEGIN
    EXEC [DBO].[CHILD1];
    EXEC [DBO].[CHILD2];
END
我要做的是编写一个查询,在一列中列出所有父存储过程,在第二列中列出所有调用的子存储过程

有没有办法做到这一点

提前感谢

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

以下示例列出了依赖于dbo.spSample\u ProcedureName的过程

您可以根据sp_进行一些更改,并提取所需内容

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

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
您可以使用DMV并获取以下信息:

选择 父项=引用\模式\名称+'.+r.引用\实体\名称, child=QUOTENAMEOBJECT\u SCHEMA\u NAMEchild.SCHEMA\u id+'.+QUOTENAMEchild.name 从sys.procedures作为子级 连接sys.dm\u sql\u引用\u实体 QUOTENAMEOBJECT_SCHEMA_NAMEchild.SCHEMA_id+'.+QUOTENAMEchild.name, “OBJECT”作为r;
这回答了你的问题吗?具体来说,第二个答案指的是dm_sql_引用_entities@PeterSmithdm_sql_引用_实体是否不像我想的那样工作?@PeterSmith OP使用标准EXEC语句,没有动态sql。看看这个来证明这一点works@Charlieface这太棒了,下面是我的+1,谢谢你的澄清
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