我有一个SSRS报告,其数据源连接到Oracle数据库,然后使用透明网关提取DB2数据。由于使用了日期范围验证,并且有一个可选参数,我使用udf动态构建sql语句。这很有效......
Public Function getData(FromDate AS DATE, ToDate AS DATE, Plant AS STRING, PartNumber AS STRING, ExtTxnCd AS STRING, DateRangeValid AS STRING) AS STRING
Dim sqlStmt AS STRING = ""
sqlStmt = "SELECT ITEM_NO, TXN_DATE, TXN_TIME, QUANTITY, ITEM_DESC, PLANT_NO, ORDER_NO, INT_TXN_CD, EXT_TXN_CD, AREA||ROW||BIN||SHELF Secondary_Loc FROM TABLEA, TABLEB"
sqlStmt = sqlStmt + " WHERE TXN_DATE >= '" + FromDate + "'"
sqlStmt = sqlStmt + " AND TXN_DATE < '" + ToDate + "'"
sqlStmt = sqlStmt + " AND PLANT_NO = '" + Plant + "'"
IF PartNumber <> Nothing THEN
sqlStmt = sqlStmt + " AND REPLACE(ITEM_NO,' ','') = '" + PartNumber + "'"
END IF
sqlStmt = sqlStmt + " AND EXT_TXN_CD = '" + ExtTxnCd + "'"
sqlStmt = sqlStmt + " AND 'True' = '" + DateRangeValid + "'"
sqlStmt = sqlStmt + " AND A_INT_TXN_CD||A_TXN_DESC_CODE = B_INT_TXN_CD||B_TXN_TYPE_CD ORDER BY TXN_DATE, TXN_TIME"
RETURN sqlStmt
END Function
问题出现在需要让其中一个报告参数(ExtTxnCd)允许选择多个值(我已经这么多次了,就像这样动态构建sql语句时还没有)。如果我要对它进行硬编码,那么这个条件看起来就像......
AND EXT_TXN_CD IN ('ABC123','ABC234','ABC678', 'ABC789')
当我更改参数属性以允许多个值,并将函数的where子句中的2行更改为:
sqlStmt = sqlStmt + " AND THF_EXT_TXN_CD IN ('" + ExtTxnCd + "'"
sqlStmt = sqlStmt + ") AND 'True' = '" + DateRangeValid + "'"
...并尝试运行报告,我收到错误:
'无法为数据集添加多值查询参数'@ExtTxnCd' '数据集1',因为数据扩展不支持它。'
然后我更改了我的数据集查询,调用函数,将该参数值传递为Join(Parameters!ExtTxnCd.Value,",")
,并在数据集参数中,更改了该参数的值以使用JOIN。现在我没有得到错误,但是在根据所选参数预期数据时没有返回数据。
我认为问题是参数值''ABC123,ABC234等......'作为逗号分隔值传递,但是作为一个长字符串值传递,而不是传递给包含的每个值单引号。如何使用单引号中的每个值构建动态sql语句?
答案 0 :(得分:0)
您需要使用引号分隔参数。试试Join(Parameters!ExtTxnCd.Value, "','")
这意味着你的字符串是在两个地方构建的:SSRS中的插入引号和逗号以及Oracle udf的括号和外部引号。在一个地方建立所有这一切并不那么令人困惑,因此SSRS成为:
"('" & Join(Parameters!ExtTxnCd.Value, "','") & "')"
在Oracle udf中它只是:
sqlStmt = sqlStmt + " AND THF_EXT_TXN_CD IN " + ExtTxnCd