如何在SQL Server的过程中获取递归的函数列表?

时间:2018-02-16 23:23:45

标签: sql sql-server recursion

我有一个程序列表,我可以在这些程序中获得一系列功能。

但我需要创建一种递归方式来查看这些函数中是否有函数。这是我开始的方式:

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

这段代码为我提供了一个程序和功能列表。

我怎么能在这里更进一步,以确保我对我在这里找到的函数进行递归,这样如果这些函数中有函数,我也会看到它?

注意:我不需要对实际过程进行递归。程序清单已经是我需要的所有程序。我只是在寻找函数中的函数。

感谢您的帮助!

1 个答案:

答案 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%'))