如何在查询(BIRT)中动态替换where子句?

NGB*_*NGB 1 sql birt where-clause

在我的报告查询中,我有一个where子句,需要根据前端选择的数据动态替换.

查询类似于:

哪里?=?

我已经有一个替换值的代码 - 我创建了报告参数并链接到了值?在查询中.

示例: name =?

来自前端的任何名称值都会替换?在where子句中 - 这很好用.

但现在我需要替换整个子句(其中?=?).我应该创建两个参数并将它们链接到'?' ?

Dom*_*que 5

不,遗憾的是,大多数数据库引擎不允许使用查询参数来处理动态列名.这是出于安全考虑.

因此,您需要在查询中保留任意列名:

where name=?
Run Code Online (Sandbox Code Playgroud)

然后在数据集的"beforeOpen"脚本中用报告参数值替换"name":

this.queryText=this.queryText.replace("name",params["myparameter"].value);
Run Code Online (Sandbox Code Playgroud)

为防止SQLIA,我建议在此脚本中测试参数的值.有很多方法可以做到这一点,但白名单是最强的测试,例如:

var column=params["myparameter"].value;
if (column=="name" || column=="id" || column=="account" || column=="mycolumnname"){
  this.queryText=this.queryText.replace("name",column);
}
Run Code Online (Sandbox Code Playgroud)