如何创建一个接受多个(CSV)值的BIRT数据集,它可以在select语句的“IN”子句中使用

时间:2013-09-04 07:04:47

标签: reporting-services birt

我正在尝试在BIRT报告中创建一个包含带有“IN”子句的select语句的数据集,并用逗号分隔值代替“?”使用接受多个值的BIRT参数。

例如:select * from table in where in(?)

我尝试在我的数据集中添加这个“select * from table in where in(params [”paramer_name“]。value)”但它不起作用。

我不想使用内置的BIRT数据集过滤器,因为在查询中使用“IN”子句可以在我的数据库服务器中大大降低查询成本。

有没有一种简单的方法可以在不添加长java脚本的情况下做同样的事情???

仅供参考:用户选择的参数列表来自另一个数据集,我想将所选值用作另一个数据集的输入。

非常感谢你的帮助......

1 个答案:

答案 0 :(得分:6)

我们不能使用常规SQL参数'?'来执行此操作。

解决方法是替换这个'?'通过查询中的默认值,并在数据集的“beforeOpen”脚本中动态注入相应的逗号分隔值列表:

默认查询

假设ID的数据类型是一个整数,请像这样设置查询(当然这里使用有效的ID来预览数据):

select * from table where ID in ( 1000 )

“beforeOpen”数据集的脚本:

   this.queryText=this.queryText.replaceAll('1000',params["parameter_name"].value.join(","));

这样,如果“parameter_name”返回3个值1100,1200,1300,则发送到数据库的查询将是:

select * from table where ID in ( 1100,1200,1300)

如果ID的数据类型是String,则类似,我们只需要用引号播放一下。但是对于String类型,这种处理使得SQL注入攻击成为可能,我们首先应该检查参数值是否与我们期望的一样。