带 UDF 和动态的 SSRS SQL

SSRS with UDF and dynamic SQL

我有一个 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 子句中的两行更改为:

sqlStmt = sqlStmt + " AND THF_EXT_TXN_CD IN ('" + ExtTxnCd + "'"
sqlStmt = sqlStmt + ") AND 'True' = '" + DateRangeValid + "'"

...然后尝试 运行 报告,我得到一个错误:

'Cannot add multiple value query parameter '@ExtTxnCd' for dataset 'Dataset1' because it is not supported by the data extension.'

然后我更改了我的数据集查询,调用函数,将参数值作为 Join(Parameters!ExtTxnCd.Value,",") 传递,并在数据集参数中,更改该参数的值以也使用 JOIN。现在我没有收到错误,但是在根据所选参数期望数据时没有返回任何数据。

我认为问题是参数值... 'ABC123,ABC234,etc..' 作为逗号分隔值传递,但作为一个长字符串值传递,而不是将每个值传递给单引号.我将如何使用单引号中的每个值构建动态 sql 语句?

您需要用引号分隔参数。尝试 Join(Parameters!ExtTxnCd.Value, "','")

这意味着您的字符串是在两个地方构建的:SSRS 中的中间引号和逗号以及您的 Oracle udf 中的方括号和外部引号。在一个地方构建它会更容易混淆,所以 SSRS 变成:

"('" & Join(Parameters!ExtTxnCd.Value, "','") & "')"

而在 Oracle udf 中它只是:

sqlStmt = sqlStmt + " AND THF_EXT_TXN_CD IN " + ExtTxnCd