反馈已提交

网络繁忙

SQL函数

  • 文档创建者:lu123
  • 历史版本:38
  • 最近更新:Carly 于 2023-09-20
  • 1. 概述

    1.1 版本

    报表服务器版本
    功能变更
    11.0-
    11.0.18新增防 SQL 注入书写方式,对安全问题需求较高可采用新写法,原写法仍可用

    1.2 函数作用

    数据集函数 能够从数据集中直接进行条件取数,但是有的时候用户希望某个单元格能够直接获取到数据库中的某个值,而不是先要定义一个数据集后,再去取数据。

    这时就可以用 SQL 函数。

    1.3 函数解释

    语法
    SQL(connectionName,sql,columnIndex,rowIndex)返回的数据是从 connectionName 数据库中获取的 SQL 语句的表中的第 columnIndex 列第 rowIndex 行所对应的元素。
    参数1connectionName数据连接名字,字符串形式,需要用引号如"FRDemo";
    参数2sqlSQL语句,字符串形式
    参数3columnIndex列序号,整型;
    参数4rowIndex行序号,整型。

    注:行序号可以省略,这样返回值为数据列。

    1.4 注意事项

    仅支持执行select查询语句,不支持执行insert、delete、update等增删改语句。

    2. 取数据库中不带参数的指定内容

    示例数据:内置数据库 FRDemo 中的 STSCORE 数据表。

    从内置数据库「FRDemo」里的 STSCORE 表取第三行第三列数据值。

    从表 STSCORE 中,可看到第 3 行第 3 列的值为 Alex,如下图所示:

    现在若要直接在报表的单元格中显示数据值:Alex,而不是通过先定义一个数据集后,再去取数据的方式,使用 sql() 公式,此时只需在单元格中输入:=sql("FRDemo","SELECT * FROM STSCORE",3,3)即可,预览就可看到 Alex 值,如下图所示:

    3. 取数据库中带有参数的指定内容

    示例数据:内置数据库 FRDemo 中的 STSCORE 数据表。

    3.1 SQL 参数为普通参数

    需要取出班级为 Class1 的第 3 列所有值。

    在单元格中输入:=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = 'Class1' ",3),显示效果(班级为 Class1 的第 3 列所有值),如下图所示:

    公式说明:

    公式
    说明
    "FRDemo"数据连接名
    "SELECT * FROM STSCORE where CLASSNO = 'Class1' "SQL 语句;查询 CLASSNO 为 Class1 的数据
    3列序号,第三列的数据

    若需要显示某个具体值,如显示 Jonny (即班级为 Class1 的第 3 列第 4 行的值),写法如下:

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = 'Class1' ",3,4)

    3.2 SQL 参数为变量

    注:不支持引用数据参数。

    若参数值为变量如为报表参数或者是某个单元格,则写法如下:

    11.0.18及之后版本支持较安全的SQL防注入写法:

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '${class}' ",3,4) 

    所有版本支持:

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '"+$class+"' ",3,4) 

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '"+A1+"' ",3,4)

    示例:

    例如希望过滤控件选择不同班级,显示不同班级下所有的同学的名字。

    首先设置模板参数「class」,然后在单元格中输入公式:=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '${class}' ",3),如下图所示:

    2023-06-30_15-38-31.png

    显示效果如下图所示:

    1629702747622307.gif

    如果传递的参数是获取当前单元格的值,即用 $$$ 作为参数时,字符串类型同样需要拼接单引号。

    11.0.18及之后版本支持较安全的SQL防注入写法:

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '${$$$}' ",3,4)

    所有版本支持:

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '"+$$$+"' ",3,4)

    注1:如果参数或者单元格值有多个,那么 SQL 函数的写法如下:

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO in ('"+$class+"') and COURSE  in ('"+$COURSE+"') ",3,4)

    注2:class 参数返回值的分隔符需为',',具体请查下拉复选框参数联动

    3.3 SQL 参数为变量且需要拼接

    在 SQL 中还可以使用 IF 函数进行判断并拼接模板参数。例如希望实现当参数 class 为空时,选择全部学生姓名,可输入公式:

    =sql("FRDemo","SELECT * FROM STSCORE where 1=1 "+if(len(class)== 0,"","and CLASSNO = '"+class+"'"),3)

    公式说明:

    公式
    说明
    "SELECT * FROM STSCORE where 1=1 "将 SQL 语句两边加上引号作为字符串
    +if(len(class)== 0,"","and CLASSNO = '"+class+"'"

    这里的+是指字符串拼接符号

    将前面的 SQL 语句通过+进行拼接

    当参数「class」为空,查询语句相当于:SELECT * FROM STSCORE 

    当参数「class」不为空时,查询语句相当于:

    SELECT * FROM STSCORE  WHERE 1=1 and CLASSNO ='${class}' 

    sql("FRDemo","SELECT * FROM STSCORE where 1=1 "+if(len(class)== 0,"","and CLASSNO = '"+class+"'"),3)

    当参数「class」为空,相当于:sql("FRDemo","SELECT * FROM STSCORE",3)  

    当参数「class」不为空时,查询语句相当于:

    sql("FRDemo","SELECT * FROM STSCORE  WHERE 1=1 and CLASSNO ='${class}'",3)

    如果在 SQL 中参数为模糊查询时,可使用如下公式:

    11.0.18及之后版本支持较安全的SQL防注入写法:

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO like '%${class}%' ",3,4)

    所有版本支持:

    =sql("FRDemo","SELECT * FROM STSCORE where CLASSNO like '%"+$class+"%' ",3,4)

    附件列表


    主题: 报表专题
    • 有帮助
    • 没帮助
    • 只是浏览
    中文(简体)

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持