存储过程中的返回计数

时间:2011-02-28 16:21:47

标签: sql sql-server tsql stored-procedures

我写了一个存储过程来返回一个计数。但我得到了一个空值。任何人都可以告诉我存储过程中的问题在哪里。

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[ValidateUser]
@UserName varchar(50),
@Password varchar(50),
@Num_of_User int output

AS 
BEGIN
  SET NOCOUNT ON;

  SELECT @Num_of_user =COUNT(*) 
    FROM login
   WHERE username = @UserName 
     AND pw = @Password

  RETURN

END

6 个答案:

答案 0 :(得分:9)

您将值设置为变量@num_of_user。在查询后添加select @num_of_user

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[ValidateUser]
    @UserName varchar(50),
    @Password varchar(50),
    @Num_of_User int output

AS
BEGIN
    SET NOCOUNT ON;
     SELECT @Num_of_user =COUNT(*) 
         FROM login
         WHERE username=@UserName AND pw=@Password

     SELECT @Num_of_user
return
END

答案 1 :(得分:2)

它实际上不返回计数,它是一个输出参数。

更改您的sproc以返回@num_of_user或检查输出参数而不是返回值。

答案 2 :(得分:1)

SQL Server中的过程和函数对我来说有点混乱,因为过程也可以返回一个值。但是,您可以通过删除输出参数@Num_of_user并替换

来实现所需的功能
SELECT @Num_of_user =COUNT(*) 
    FROM login
   WHERE username = @UserName 
     AND pw = @Password

SELECT COUNT(*) 
    FROM login
   WHERE username = @UserName 
     AND pw = @Password

始终从SQL Server中的PROCEDURE返回最后一个select语句。

答案 3 :(得分:0)

你不需要isnull。选择count(*)始终返回非空值。你甚至可以发一个

select count(*) from anytable where 1=2 

你将获得0,而不是null。我认为当你执行sp时你的问题就到了。您可能缺少@Num_of_User旁边的'output'关键字。你的电话应该是

declare @outNum int 
exec ValidateUser 'some', 'wrong', @outNum output
print @outNum

注意参数右侧的'output'关键字

答案 4 :(得分:0)

只是另一种方法,但在存储过程之外是一个简单的方法 SELECT @@ROWCOUNT 可以工作以获得行数。

答案 5 :(得分:0)

返回null时有同样的问题;尝试使用括号:

SELECT @Num_of_user = ( COUNT(*) 
    FROM login
   WHERE username = @UserName 
     AND pw = @Password )