2016-09-01 89 views
0

我還在學習SQL和無法理解這些2如下區別:SQL Server存儲過程使用或不輸出參數

方法1:

create proc sp_test1 
    @count int out, 
    @SalePrice int 
as 
begin 
    SELECT @Count = COUNT(*) 
    FROM dbo.SalesHistory 
    WHERE SalePrice = @SalePrice; 
end 

declare @Count int; 

exec sp_test1 @SalePrice = '967', @Count = @Count output; 

select @Count; 

方法2:

create proc sp_test2 
    @SalePrice int 
as 
begin 
    SELECT COUNT(*) 
    FROM dbo.SalesHistory 
    WHERE SalePrice = @SalePrice; 
end 

exec sp_test2 @SalePrice = '967'; 

兩者都應返回一個數字。但是這兩者有什麼區別?我在哪種情況下使用每個?感謝你們!

+0

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

@marc_s對不起,我應該在「sp_test1」之前放置模式名稱。謝謝你提醒我。 –

回答

1

在這種情況下,沒有實際的區別,也沒有真正的理由做額外的工作來創建輸出參數。

輸出參數可能有用的一個示例是數據集從存儲過程返回的情況,但您也希望單個信息適用於整個集合....例如,也許您希望SQL Server執行查詢的確切時間。或者也許有一些這樣的項目。您可以將它們作爲單獨的「SELECT ...」數據集返回,但這可能很麻煩,而且在應用程序代碼中不清楚返回的內容。而不是命名輸出參數,你只會有索引表。因此,這將是考慮使用輸出參數的明智之選。

輸出參數從不需要,但它們可以很好地將標量數據返回給調用應用程序。

+0

非常感謝! –

0

這兩個過程是相似的,但應用程序可能會有所不同,例如讓我們假設您正在創建一個網頁,並有一個網格。當我們放置網格時,我們通常會分頁數據集,最終用戶需要知道那裏有多少個尋呼機。在這種情況下,您可以使用第二個實現。

第一個實現非常簡單,您只需從數據庫中選擇一個數據集。

最後我想突出顯示輸出參數是可選的。

+0

你的意思是第二個是直截了當的嗎? –

+0

對不起,它不是第一個聲明的第二個 – Prabhakantha

相關問題