1. 概述
1.1 版本
報表伺服器版本 | 功能變更 |
---|---|
11.0 | - |
11.0.18 | 新增防 SQL 注入書寫方式,對安全問題需求較高可採用新寫法,原寫法仍可用 |
1.2 函式作用
資料集函式 能夠從資料集中直接進行條件取數,但是有的時候使用者希望某個儲存格能夠直接獲取到資料庫中的某個值,而不是先要定義一個資料集後,再去取資料。
這時就可以用 SQL 函式。
1.3 函式解譯
文法 | SQL(connectionName,sql,columnIndex,rowIndex) | 傳回的資料是從 connectionName 資料庫中獲取的 SQL 語句的表中的第 columnIndex 列第 rowIndex 行所對應的元素。 |
---|---|---|
參數1 | connectionName | 資料連結名稱,字串形式,需要用引號如"FRDemo"; |
參數2 | sql | SQL語句,字串形式 |
參數3 | columnIndex | 列序號,整數型態; |
參數4 | rowIndex | 行序號,整數型態。 |
注:行序號可以省略,這樣傳回值為資料列。
1.4 注意事項
僅支援執行select查詢語句,不支援執行insert、delete、update等增刪改語句。
2. 取資料庫中不帶參數的指定內容
範例資料:內建資料庫 FRDemoTW 中的 STSCORE 資料表。
從內建資料庫「FRDemoTW」裏的 STSCORE 表取第三行第三列資料值。
從表 STSCORE 中,可看到第 3 行第 3 列的值為 Alex,如下圖所示:
現在若要直接在報表的儲存格中顯示資料值:Alex,而不是透過先定義一個資料集後,再去取資料的方式,使用 sql() 公式,此時只需在儲存格中輸入:=sql("FRDemoTW","SELECT * FROM STSCORE",3,3)即可,預覽就可看到 Alex 值,如下圖所示:
3. 取資料庫中帶有參數的指定內容
範例資料:內建資料庫 FRDemoTW 中的 STSCORE 資料表。
3.1 SQL 參數為普通參數
需要取出班級為 Class1 的第 3 列所有值。
在儲存格中輸入:=sql("FRDemoTW","SELECT * FROM STSCORE where CLASSNO = 'Class1' ",3),顯示效果(班級為 Class1 的第 3 列所有值),如下圖所示:
公式說明:
公式 | 說明 |
---|---|
"FRDemoTW" | 資料連結名 |
"SELECT * FROM STSCORE where CLASSNO = 'Class1' " | SQL 語句;查詢 CLASSNO 為 Class1 的資料 |
3 | 列序號,第三列的資料 |
若需要顯示某個具體值,如顯示 Jonny (即班級為 Class1 的第 3 列第 4 行的值),寫法如下:
=sql("FRDemoTW","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("FRDemoTW","SELECT * FROM STSCORE where CLASSNO = '${class}' ",3),如下圖所示:
顯示效果如下圖所示:
如果傳遞的參數是獲取當前儲存格的值,即用 $$$ 作為參數時,字串類型同樣需要連結單引號,例如:
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("FRDemoTW","SELECT * FROM STSCORE where CLASSNO in ('${class}') and COURSE in ('${COURSE}') ",3,4)"
注2:class 參數傳回值的分隔符需為',',具體請查看SQL語句實現下拉框參數聯動。
3.3 SQL 參數為變數且需要連結
在 SQL 中還可以使用 IF 函式進行判斷並連結範本參數,例如希望實現當參數 class 為空時,選擇全部學生姓名,可輸入公式:
=sql("FRDemoTW","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("FRDemoTW","SELECT * FROM STSCORE where 1=1 "+if(len(class)== 0,"","and CLASSNO = '${class}'"),3) | 當參數「class」為空,相當於:sql("FRDemoTW","SELECT * FROM STSCORE",3) 當參數「class」不為空時,查詢語句相當於:sql("FRDemoTW","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)