SSRS中如何通过文件名关联三张表完成Report Builder报表开发
SSRS三张表关联实现方案
方案1:数据源查询层面关联(优先推荐,性能最优)
你已经完成了表1和表3的id左连接,只需在查询逻辑中新增和表2的模糊关联条件即可,核心是通过字符串查找函数判断表3的text字段是否包含表2的file name值。
以下为SQL Server数据源的示例代码,其他数据库仅需替换对应字符串查找函数即可:
SELECT t1.membername, t1.id, t1.team, t3.text, t2.[file name] FROM 表1 t1 LEFT JOIN 表3 t3 ON t1.id = t3.id -- 新增和表2的关联逻辑 LEFT JOIN 表2 t2 ON CHARINDEX(t2.[file name], t3.text) > 0
说明:
- 该方案比用
LIKE匹配更稳妥,无需额外处理文件名中包含的通配符转义问题 - 若单条
text内容包含多个文件名,会生成对应多条结果;如需合并为单行,可配合GROUP BY+STRING_AGG函数处理 - 其他数据源对应函数替换:PostgreSQL用
POSITION(t2."file name" IN t3.text) > 0,MySQL用INSTR(t3.text, t2.file name) > 0
方案2:Report Builder报表层面关联(适用于无法修改数据源查询的场景)
如果没有权限修改原始查询语句,可在报表端通过自定义代码实现匹配:
- 为表2单独创建数据集
ds_file,查询所有file name字段的值 - 右键报表空白处打开「报表属性」,切换到「代码」标签,粘贴以下自定义VB函数:
Function GetMatchingFileName(searchText As String, fileNames As Object()) As String For Each fileName As String In fileNames If InStr(searchText, fileName) > 0 Then Return fileName End If Next Return "" End Function
- 在你已有的表1+表3的关联数据集中新增计算字段,填写以下表达式:
=Code.GetMatchingFileName(Fields!text.Value, LookupSet(1=1, 1=1, Fields!file name.Value, "ds_file"))
说明:该方案会在报表加载时遍历所有文件名做匹配,若表2数据量较大时会降低报表加载速度,仅作为备选方案使用。
内容的提问来源于stack exchange,提问作者Hw3zs
相关产品推荐
相关产品推荐

