使用UDF和动态SQL

时间:2015-08-03 17:56:10

标签: reporting-services ssrs-2014

我有一个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语句?

1 个答案:

答案 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