SQL 查询列出在父存储过程中执行的所有存储过程
A SQL query to list all stored procedures executed in a parent stored procedure
我在 Azure SQL 数据库中有多个执行多个存储过程的存储过程。
例如:
CREATE PROCEDURE [DBO].[PARENT] AS
BEGIN
EXEC [DBO].[CHILD1];
EXEC [DBO].[CHILD2];
END
我想要做的是编写一个查询,在一列中列出我拥有的所有父存储过程,在第二列中列出所有调用的子存储过程。
有办法吗?
提前致谢
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
您可以使用 DMV sys.procedures
and sys.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;
我在 Azure SQL 数据库中有多个执行多个存储过程的存储过程。
例如:
CREATE PROCEDURE [DBO].[PARENT] AS
BEGIN
EXEC [DBO].[CHILD1];
EXEC [DBO].[CHILD2];
END
我想要做的是编写一个查询,在一列中列出我拥有的所有父存储过程,在第二列中列出所有调用的子存储过程。
有办法吗?
提前致谢
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
您可以使用 DMV sys.procedures
and sys.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;