原因:在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這樣的話,以達到優化存儲過程的目的。