2011-12-07 226 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