2014-01-31 97 views
0

SP定義與返回參數需要返回參數的存儲過程

if OBJECT_ID('CountSeatleEmployee') is not null 
drop proc CountSeatleEmployee 

go 

CREATE PROC CountSeatleEmployee 
AS 
DECLARE @Total int 
SELECT @Total =Count(*) 
from [AdventureWorks2012].[Person].[Person] P 
WHERE P.EMAILPROMOTION =0 
RETURN @Total 

--Execute SP 
declare @Count int 
exec @Count = CountSeatleEmployee 
SELECT @COUNT 
--11158 Records 

--same SP without Return Parameter 

if OBJECT_ID('CountSeatleEmployee') is not null 
drop proc CountSeatleEmployee 
go 
CREATE PROC CountSeatleEmployee 
AS 
SELECT Count(*) 
from [AdventureWorks2012].[Person].[Person] P 
WHERE P.EMAILPROMOTION =0 

exec CountSeatleEmployee' 

現在爲什麼不直接使用以下。這兩個提供相同的輸出。爲什麼我們種子返回參數

回答

0

單向提供返回變量中的信息,然後通過選擇變量將另一個數據集或記錄集轉換爲記錄集。它取決於你想要使用哪一個應用程序。

if OBJECT_ID('CountSeatleEmployee') is not null 
drop proc CountSeatleEmployee 

go 

CREATE PROC CountSeatleEmployee 
AS 
DECLARE @Total int 
SELECT @Total =Count(*) 
from [AdventureWorks2012].[Person].[Person] P 
WHERE P.EMAILPROMOTION =0 


Select * from [AdventureWorks2012].[Person].[Person] P 
WHERE P.EMAILPROMOTION =0 
RETURN @Total 

--Execute SP 
declare @Count int 
exec @Count = CountSeatleEmployee --This will return the recordset of the table and returns the total rows into the variable @Count 
SELECT @COUNT 
1

根據我的經驗,返回值通常用於錯誤條件。並非每個人都有相同的經歷。

RETURN語句僅限於返回一個整數,所以它的用處有一定的限制(在我看來)。我更喜歡第二種方法,因爲它可以使代碼更加一致。想象一下你想要一個名字而不是一個計數,你將無法使用return語句。另一方面,有些人更喜歡第一種使用return語句的方法(無論哪裏都可以這樣做)。理由是它是一種優化技術。當您從前端調用第一個代碼示例時,不需要處理該過程並期望它會返回結果集。相反,它只是從數據庫傳回的單個4字節值。第二個例子需要在前端進行更多的處理,因爲一個過程可以返回各種各樣的東西。它可以返回多個結果集,每個結果集可以包含多列和多行。您的前端代碼需要評估返回的數據,然後構建處理數據的適當結構。這需要額外的CPU週期。

我不一定會推薦一個,我只是想解釋的理由。