2011-12-07 127 views
0

我有查詢返回單個值(即)計數。我用下面的方式存儲的過程,並使用與數據集執行讀寫器獲取單個值從存儲過程有效返回值

CREATE PROCEDURE GetCnt 
@EmpNo char(4) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    Declare @Cnt int 
    SELECT @Cnt = count(*) 
    FROM employees 
    WHERE EMPLNO = @EmpNo 
     AND test = 'p'    

    BEGIN 
     SELECT @Cnt 
    END 
END 

exceuting正是這種effcient方式 或者我需要使用execute.scalar(),並返回值直接從查詢而不是分配到@cnt 可以任何一個人告訴我

+0

似乎確定,但你並不需要一個額外的'開頭。 ... END',因爲這個存儲過程返回的只是一行和一列,所以你通常使用'var result = sqlCommand.ExecuteScalar()'從.NET調用這個 –

+0

既然您使用單個列重新調整結果集的單行,您應該使用ExecuteScaler。它針對這種情況進行了選擇。 – user957902

+0

嘗試這兩種方式,看看...我懷疑它會造成很大的差異無論如何。 –

回答

0

您不需要創建變量。你只需要:

CREATE PROCEDURE GetCnt 
@EmpNo char(4) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT count(1) 
    FROM employees 
    WHERE EMPLNO = @EmpNo 
     AND test = 'p'    
END 

因爲這是唯一一個從存儲過程返回值,你可能會想使用ExecuteScalar()

+0

爲什麼COUNT(1)? http://stackoverflow.com/a/1221649/27535 – gbn

+0

@gbn除了習慣我沒有理由,因爲它相當於'COUNT(*)' –

1

全部ExecuteScalar確實是從第一個記錄獲得第一個字段。

難道你只是SELECT直接計數?

BEGIN 
    SET NOCOUNT ON 
    SELECT Count(*) FROM employees WHERE EMPLNO = @EmpNo AND test='p' 
END