0

我有一个 SSRS 报告,其中的数据源连接到 Oracle db,然后使用透明网关提取 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 + "'"

...并尝试运行报告,我收到一个错误:

'无法为数据集'Dataset1'添加多值查询参数'@ExtTxnCd',因为它不受数据扩展支持。'

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

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

4

1 回答 1

1

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

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

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

在 Oracle udf 中,它很简单:

sqlStmt = sqlStmt + " AND THF_EXT_TXN_CD IN " + ExtTxnCd
于 2015-08-04T03:57:03.280 回答