我写了一个存储过程来返回一个计数。但我得到了一个空值。任何人都可以告诉我存储过程中的问题在哪里。
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
答案 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 )