如何通过Custom SQL在Sparx EA中统计指定包的函数数量并生成图表
在Sparx EA中限定Custom SQL的包范围统计函数总数
你需要修正原SQL的关联逻辑,并添加包过滤条件,就能限定搜索范围到指定包。以下是几种实用的方案:
基础版:仅统计指定包(不含子包)的函数总数
按包名称筛选
如果知道目标包的名称,用这个查询:
SELECT COUNT(t_object.Object_ID) AS 函数总数, t_package.Name AS 所属包 FROM t_object JOIN t_package ON t_object.Package_ID = t_package.Package_ID WHERE t_object.Stereotype = 'Function' AND t_package.Name = '目标包名称' -- 替换成你要统计的包名 GROUP BY t_package.Name
按包ID筛选(更精准,避免重名)
包ID可以在Sparx EA中查看(选中包后,在属性面板里找ID),用这个更准确:
SELECT COUNT(t_object.Object_ID) AS 函数总数, t_package.Name AS 所属包 FROM t_object JOIN t_package ON t_object.Package_ID = t_package.Package_ID WHERE t_object.Stereotype = 'Function' AND t_package.Package_ID = 123 -- 替换成目标包的实际ID GROUP BY t_package.Name
进阶版:统计指定包及其所有子包的函数总数
如果目标包有嵌套的子包,需要递归查询包层级,才能包含所有子包下的函数:
WITH RecursivePackages AS ( SELECT Package_ID, Name, Parent_ID FROM t_package WHERE Package_ID = 123 -- 替换成目标包ID UNION ALL SELECT p.Package_ID, p.Name, p.Parent_ID FROM t_package p JOIN RecursivePackages rp ON p.Parent_ID = rp.Package_ID ) SELECT COUNT(t.Object_ID) AS 函数总数, rp.Name AS 所属根包 FROM t_object t JOIN RecursivePackages rp ON t.Package_ID = rp.Package_ID WHERE t.Stereotype = 'Function' GROUP BY rp.Name
补充说明
- 原SQL里
t_object和t_package没有关联条件,会产生笛卡尔积,必须用JOIN通过Package_ID关联两者 - 如果你需要保留每个函数的名称(和原查询逻辑一致),只需要把
COUNT(t_object.Object_ID)改成t_object.Name,去掉GROUP BY即可,但这样返回的是单个函数列表,不是总数
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

