finereport報表,使用帶參數的sql存儲過程,報沒有返回數據集的錯


原因:在SqlServer數據庫中,若定義的存儲過程中包含有insert/update等更新操作時,在設計器中對存儲過程進行調用時,會提示沒有返回數據集的錯誤。

解決方法:修改存儲過程,在begin 后面添加 SET NOCOUNT ON。

不管多復雜的sql存儲過程 只需要在第一個大的begin后面添加 如下:

ALTER proc [dbo].[proc_enterylist] @qybm varchar(50),@strWhere varchar(2000)='',@stratrow int,@pagesize int ,@total int out
as
begin
       SET NOCOUNT ON /*在此處添加*/
	 declare @fcompnbr varchar(50)
      .
      .
      .
      .
      .
      . select * from #t c group by zslxname,zslx end GO

通過在數據庫查詢處調用存儲過程

若存儲過程已經定義好,不希望再修改,這時可以通過模板數據集>數據庫查詢處調用存儲過程,並在調用前增加SET NOCOUNT ON,最后執行的語句為:

SET NOCOUNT ON
exec proc_enterylist '${qybm}','',0,1,20

注:Oracle數據庫中不存在這樣的問題,只要成功創建一個存儲過程,在設計器中正常調用即可,不會出現類似的問題。

 

SET NOCOUNT:使返回的結果中不包含有關受 Transact-SQL 語句影響的行數的信息。

 

語法 SET NOCOUNT { ON | OFF }

 

注釋 :當 SET NOCOUNT 為 ON 時,不返回計數(表示受 Transact-SQL 語句影響的行數)。當 SET NOCOUNT 為 OFF 時,返回計數。

 

即使當 SET NOCOUNT 為 ON 時,也更新 @@ROWCOUNT 函數。

 

當 SET NOCOUNT 為 ON 時,將不給客戶端發送存儲過程中的每個語句的 DONE_IN_PROC 信息。當使用 Microsoft SQL Server 提供的實用工具執行查詢時,在 Transact-SQL 語句(如 SELECT、INSERT、UPDATE 和 DELETE)結束時將不會在查詢結果中顯示"nn rows affected"。

 

如果存儲過程中包含的一些語句並不返回許多實際的數據,則該設置由於大量減少了網絡流量,因此可顯著提高性能。

 

SET NOCOUNT 設置是在執行或運行時設置,而不是在分析時設置。

 

權限 SET NOCOUNT 權限默認授予所有用戶。

 

結論:我們應該在存儲過程的頭部加上SET NOCOUNT ON 這樣的話,在退出存儲過程的時候加上 SET NOCOUNT OFF這樣的話,以達到優化存儲過程的目的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM