【问题标题】:Return count in Stored Procedure存储过程中的返回计数
【发布时间】:2011-02-28 16:21:46
【问题描述】:

我写了一个存储过程来返回一个计数。但我得到了一个空值。谁能告诉我存储过程中的问题出在哪里。

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

【问题讨论】:

  • 你是如何读取这个值的?
  • @BenCr 告诉您如何获取计数作为返回值,或使用您定义为存储过程的一部分的输出参数。 @atbebtg 告诉您如何将计数作为结果集。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

您正在将值设置为变量@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

【讨论】:

  • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!
【解决方案2】:

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

要么更改存储过程以返回@num_of_user,要么检查输出参数而不是返回值。

【讨论】:

  • 我的代码正在检查输出参数,但它为空。现在我将存储过程修改为 {ALTER PROCEDURE [dbo].[ValidateUser] @UserName varchar(50), @Password varchar(50), @Num_of_User int output AS BEGIN SET NOCOUNT ON; SELECT COUNT(*) as Num_of_user FROM login WHERE username=@UserName AND pw=@Password END} 并且 num_of_user 仍然为空。我不擅长 SProc。请帮忙。
  • 如果没有调用代码和数据库的完整副本,我不知道该如何提供帮助。您是否从 SQL Server Management Studio 测试过您的 SPROC?是数据有问题还是调用代码有问题?
【解决方案3】:

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

最后一个 select 语句总是从 SQL server 中的 PROCEDURE 返回。

【讨论】:

    【解决方案4】:

    您不需要 isnull。 Select count(*) 总是返回一个非空值。你甚至可以发出一个

    select count(*) from anytable where 1=2 
    

    你会得到一个 0,而不是 null。我认为您的问题在您执行 sp 时出现。 @Num_of_User 旁边可能缺少“输出”关键字。您的电话应该类似于

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

    注意参数右侧的“输出”关键字

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-25
          • 1970-01-01
          • 2017-12-29
          相关资源
          最近更新 更多