简体   繁体   English

根据SQL Server存储过程中的计数返回值

[英]Return value based on count from SQL Server Stored Procedure

I have the following SQL Server Stored Procedure which validates a password. 我有以下验证密码的SQL Server存储过程。

ALTER PROC [dbo].[spValidatePassword]
@UserId uniqueidentifier,
@Password NVARCHAR(255)
AS
BEGIN

DECLARE @PasswordHash NVARCHAR(255) = HASHBYTES('SHA2_512', (SELECT @Password + CAST((SELECT p.PasswordSalt FROM Passwords p WHERE p.UserId =     @UserId) AS NVARCHAR(255))))

SELECT COUNT(*)
from Passwords
WHERE UserId = @UserId
AND [Password] = @PasswordHash


--return 1 if valid password
--return 0 if not valid

END

How can I return 1 from the stored procedure if the count is greater than zero, and zero otherwise? 如果计数大于零,如何从存储过程中返回1,否则返回零?

Try this query, will return 1 if there is a result, else 0 尝试此查询,如果有结果将返回1 ,否则返回0

SELECT (CASE WHEN COUNT(*) > 1 THEN 1 ELSE 0 END)
FROM Passwords
WHERE UserId = @UserId
AND [Password] = @PasswordHash
ALTER PROC [dbo].[spValidatePassword]
@UserId uniqueidentifier,
@Password NVARCHAR(255)
AS
BEGIN

DECLARE @PasswordHash NVARCHAR(255) = HASHBYTES('SHA2_512', (SELECT @Password + CAST((SELECT p.PasswordSalt FROM Passwords p WHERE p.UserId =     @UserId) AS NVARCHAR(255))))

SELECT 
CASE WHEN EXISTS (
         SELECT *
         from Passwords
         WHERE UserId = @UserId
         AND [Password] = @PasswordHash
         )
 THEN 1 
 ELSE 0
 END


--return 1 if valid password
--return 0 if not valid

END

But consider using some other authentication model like OAuth or Office 365 logins rather than reinventing the wheel 但是,请考虑使用其他身份验证模型(例如OAuth或Office 365登录名),而不是重新发明轮子

IF    (SELECT COUNT(UserId) from Passwords WHERE UserId = @UserId  AND [Password] = @PasswordHash) > 0
begin
    return 1;
End
ELse
begin
   return 0;
end

this query will return the required result 该查询将返回所需的结果

IF EXISTS (
         SELECT *
         from Passwords
         WHERE UserId = @UserId
         AND [Password] = @PasswordHash
         )
RETURN 1;
ELSE
RETURN 0;

You can also use OUTPUT Type stored procedure to get a scalar (in your case either 1 or 0) result as: 您还可以使用OUTPUT Type存储过程来获取标量(在您的情况下为1或0)的结果为:

ALTER PROC [dbo].[spValidatePassword]
@UserId uniqueidentifier,
@Password NVARCHAR(255),
@result TINYINT OUTPUT
AS
BEGIN

DECLARE @PasswordHash NVARCHAR(255) = HASHBYTES('SHA2_512', (SELECT @Password + CAST((SELECT p.PasswordSalt FROM Passwords p WHERE p.UserId =     @UserId) AS NVARCHAR(255))))

SELECT @result = COUNT(*)
from Passwords
WHERE UserId = @UserId
AND [Password] = @PasswordHash

END

You can execute this proc as: 您可以按以下方式执行此过程:

DECLARE @output TINYINT

EXEC [dbo].[spValidatePassword]  @UserId= 'any user id',@Password = 'any password',@result = @output OUTPUT

PRINT @output

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM