Sparx EA中基于MS SQL Server的SQL查询:将ActualPost的Multiplicity转换为多行的实现方案(兼容EA查询限制)
解决Sparx EA中Multiplicity转多行的SQL方案(无WITH子句)
针对你在Sparx EA里需要将Multiplicity值展开为对应行数的需求,同时考虑到EA不支持WITH子句的限制,我们可以利用MS SQL Server内置的系统表来生成数字序列,实现行的重复。以下是可行的查询方案:
最终SQL查询(适配常规Multiplicity值)
SELECT system.Name AS Series, systemElement.Name AS GroupName FROM t_object systemElement INNER JOIN t_object system ON system.Object_ID = systemElement.ParentID INNER JOIN t_object organization ON organization.ParentID = systemElement.Object_ID INNER JOIN t_object post ON post.ParentID = organization.Object_ID AND post.Stereotype = 'ActualPost' -- 利用系统表生成1到2047的数字序列,匹配Multiplicity次数 INNER JOIN master..spt_values nums ON nums.type = 'P' AND nums.number BETWEEN 1 AND post.Multiplicity WHERE system.Name = 'Name of my main system object' ORDER BY systemElement.Name, post.Name, nums.number
针对大Multiplicity值的扩展方案
如果你的Multiplicity可能超过2047(master..spt_values的默认数字上限),可以用自连接生成更大范围的数字序列,避免上限限制:
SELECT system.Name AS Series, systemElement.Name AS GroupName FROM t_object systemElement INNER JOIN t_object system ON system.Object_ID = systemElement.ParentID INNER JOIN t_object organization ON organization.ParentID = systemElement.Object_ID INNER JOIN t_object post ON post.ParentID = organization.Object_ID AND post.Stereotype = 'ActualPost' -- 自连接生成1到10000的数字序列(可根据需求调整范围) INNER JOIN ( SELECT (a.number * 100) + b.number + 1 AS num FROM master..spt_values a CROSS JOIN master..spt_values b WHERE a.type = 'P' AND a.number < 100 AND b.type = 'P' AND b.number < 100 ) nums ON nums.num BETWEEN 1 AND post.Multiplicity WHERE system.Name = 'Name of my main system object' ORDER BY systemElement.Name, post.Name, nums.num
方案说明
- 系统表
master..spt_values的作用:- 这个内置表的
type='P'条目包含0到2047的整数,刚好用来生成重复行的计数逻辑。通过nums.number BETWEEN 1 AND post.Multiplicity,让每个post记录根据自身Multiplicity值生成对应次数的重复行。
- 这个内置表的
- 处理非整数Multiplicity:
如果post.Multiplicity存储的是字符串格式(比如"0..2"或"1"),需要先转换为纯整数,例如用CAST(REPLACE(REPLACE(post.Multiplicity, '0..', ''), '..', '') AS INT)提取有效数值。
示例验证
用你提供的测试数据运行第一个查询,会输出符合预期的结果:
| Series | GroupName |
|---|---|
| Name of my main system element | OperationalPerformer A |
| Name of my main system element | OperationalPerformer A |
| Name of my main system element | OperationalPerformer A |
| Name of my main system element | OperationalPerformer A |
| Name of my main system element | OperationalPerformer B |
| Name of my main system element | OperationalPerformer B |
| Name of my main system element | OperationalPerformer C |
| Name of my main system element | OperationalPerformer C |
| Name of my main system element | OperationalPerformer C |
| Name of my main system element | OperationalPerformer C |
| Name of my main system element | OperationalPerformer C |
| Name of my main system element | OperationalPerformer C |
| Name of my main system element | OperationalPerformer C |
| Name of my main system element | OperationalPerformer C |
| Name of my main system element | OperationalPerformer C |
内容的提问来源于stack exchange,提问作者Robbas
相关产品推荐
相关产品推荐

