我有一个程序列表,我可以在这些程序中获得一系列功能。
但我需要创建一种递归方式来查看这些函数中是否有函数。这是我开始的方式:
select referencing_id,
object_name(referencing_id) as referencing_object_name,
object_name(sed.referenced_id) as referenced_object_name
from sys.sql_expression_dependencies as sed
inner join sys.objects as obj
on sed.referencing_id = obj.object_id
inner join #temp a
on a.procedure_name = object_name(referencing_id)
where referenced_entity_name in (select name
from sys.objects
where type_desc like '%function%')
order by referencing_object_name
这段代码为我提供了一个程序和功能列表。
我怎么能在这里更进一步,以确保我对我在这里找到的函数进行递归,这样如果这些函数中有函数,我也会看到它?
注意:我不需要对实际过程进行递归。程序清单已经是我需要的所有程序。我只是在寻找函数中的函数。
感谢您的帮助!
答案 0 :(得分:1)
你可以像处理程序查询一样,而不是#temp a
,因为你没有说,我不知道那是什么。因此,您将加入引用类型为函数的sys.objects
,并在引用类型也是函数的情况下自行加入它。这是您的查询已更新,仅适用于函数:
select referencing_id,
object_name(referencing_id) as referencing_object_name,
object_name(sed.referenced_id) as referenced_object_name
from sys.sql_expression_dependencies as sed
inner join sys.objects as obj
on sed.referencing_id = obj.object_id
inner join sys.objects a
on a.name = object_name(referencing_id) and a.type_desc like '%function%'
where referenced_entity_name in (select name
from sys.objects
where type_desc like '%function%')
order by referencing_object_name
如果你想获得程序引用的函数列表,它引用了其他函数,它可以像这样:(注意:我不是100%确定这是最好的方法):
select referencing_id,
object_name(referencing_id) as referencing_object_name,
object_name(sed.referenced_id) as referenced_object_name
from sys.sql_expression_dependencies as sed
inner join sys.objects as obj
on sed.referencing_id = obj.object_id
inner join sys.objects a
on a.name = object_name(referencing_id) and a.type_desc like '%function%'
where referenced_entity_name in (select name
from sys.objects
where type_desc like '%function%')
and object_name(sed.referenced_id) in (select object_name(sed.referenced_id) as referenced_object_name
from sys.sql_expression_dependencies as sed
inner join sys.objects as obj
on sed.referencing_id = obj.object_id
inner join sys.procedures a
on a.name = object_name(referencing_id)
where referenced_entity_name in (select name
from sys.objects
where type_desc like '%function%'))