未從 iSeries DB2 SQL 儲存過程獲取 SSRS 2008r2 中的結果集
在閱讀了 DB2 UDB for iSeries SQL Programming Concepts V5R2 的“定義 SQL 過程”部分和 i5/OS 資訊中心第 5 版第 4 版的“從儲存過程返回結果集”部分後,我創建了以下儲存過程:
CREATE PROCEDURE TESTDAT.REPORT (IN DATESTART DATE, IN DATEEND DATE) LANGUAGE SQL READS SQL DATA BEGIN DECLARE CSR1 CURSOR WITH RETURN FOR SELECT * FROM SYSIBM.SYSDUMMY1; OPEN CSR1; RETURN; END
接下來,我閱讀了同一 i5/OS 資訊中心第 5 版第 4 版的“範例 1:呼叫返回單個結果集的儲存過程”部分,並嘗試從 SqlDbx 客戶端(通過 ODBC)或 SSRS 報告(通過IBMDASQL 提供程序)使用以下語句:
CALL TESTDAT.REPORT (DATE('11/01/2013'), DATE('11/03/2013'));
它執行成功,但沒有返回結果集。通過 iSeries 導航器成功執行此操作返回 2 個語句 - 選擇和聲明游標。打電話
SELECT * FROM SYSIBM.SYSDUMMY1;
返回具有 1 行“Y”的 IBMREQD 列。我從上面的文件中遺漏了什麼?
更新:
此過程生成的 SQL 包括除了已經討論過的其他選項:
SPECIFIC TESTDAT.REPORT NOT DETERMINISTIC READS SQL DATA CALLED ON NULL INPUT SET OPTION ALWBLK = *ALLREAD , ALWCPYDTA = *OPTIMIZE , COMMIT = *NONE , DECRESULT = (31, 31, 00) , DFTRDBCOL = *NONE , DYNDFTCOL = *NO , DYNUSRPRF = *USER , SRTSEQ = *HEX
它們中的任何一個都會影響將結果集返回到 SSRS 嗎?
在 SSRS 中報告 iSeries SQL 儲存過程的解決方案是通過將兩個 XML 標記添加到 RSReportDesigner.config 來將 IBM Client Access 附帶的 DB2UDB .Net 提供程序安裝到 BIDS 中。
將以下內容添加到
<Data>
.config 中的標記:<Extension Name="DB2UDB" Type="IBM.Data.DB2.iSeries.iDB2Connection,IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9CDB2EBFB1F93A26"/>
將以下內容添加到
<Designer>
標籤中:<Extension Name="DB2UDB" Type="Microsoft.ReportingServices.QueryDesigners.GenericQueryDesigner,Microsoft.ReportingServices.QueryDesigners"/>
這會將 DB2UDB 添加到數據源屬性中的提供者列表中。然後,您可以在數據源中使用具有以下格式的連接字元串:
Data Source=<IP of FQDN>;Initial Catalog=<DB name>;UserID=<user ID>;Password=<pass>;
使用者 ID 和密碼需要輸入連接字元串,因為如果輸入憑據選項卡,提供商將無法使用它們。
SSRS 報告嚮導無法基於 SP 創建報告。應改為使用基於臨時選擇語句的報告(
select * from sysibm.sysdummy1
或任何其他快速選擇都可以)。創建報表後,可以將其數據集類型從查詢更改為儲存過程。SP 名稱必須手動輸入(下拉列表為空)。必須手動輸入參數(在輸入參數之前不會刷新欄位)。參數名稱需要匹配 SP 和輸入為 的參數值
[@<param name>]
。日期參數必須指定為文本類型或日期/時間,其值表達式類似於:=FormatDateTime(Parameters!DATESTART.Value, DateFormat.ShortDate)
如果使用文本類型,請輸入不帶引號的日期,例如:2013 年 10 月 31 日
您在儲存過程聲明中缺少的一件事是
DYNAMIC RESULT SETS
選項。該選項的預設值為 0,這可能會使客戶端軟體感到困惑。它(客戶端軟體)是否甚至可以處理儲存過程返回的游標是另一回事。