2016-05-10 2 views
1

У меня есть следующая хранимая процедура SQL Server, которая проверяет пароль.Возвращаемое значение, основанное на подсчете из хранимой процедуры 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 

Как я могу вернуть 1 из хранимой процедуры, если счетчик больше нуля и нуль в противном случае?

ответ

2
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 

Но рассмотреть вопрос об использовании какой-либо другой модели аутентификации, как OAuth или Office 365 логинов, а не изобретать колесо

+0

T Хэнкс Ник. Аутентификация использует OWIN, но она противоречит устаревшей базе данных. – Graham

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

этот запрос будет возвращать требуемый результат

+1

No. Если есть 3 сопоставимые записи, это вернет 3. Результат не отличается от 'COUNT (*)' –

+0

проверить измененный ответ –

+0

Итак, теперь это возвращает данные с помощью 'RETURN', а не' SELECT' –

3

Попробуйте этот запрос будет возвращать 1 если есть результат, еще 0

SELECT (CASE WHEN COUNT(*) > 1 THEN 1 ELSE 0 END) 
FROM Passwords 
WHERE UserId = @UserId 
AND [Password] = @PasswordHash 
+1

, и если есть 10 подходящих строк, этот выбор возвращает 10 строк 1's –

+0

@ Nick.McDermaid, No, Never, вы можете попробовать COUNT в простой таблице с предложением WHERE. –

+1

О! Интересно, что я никогда этого не знал. Я забираю его обратно. –

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

Вы также можете использовать выход типа хранимой процедуры, чтобы получить скаляр (в вашем случае либо 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 

Вы можете выполнить это срабатывать как:

DECLARE @output TINYINT 

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

PRINT @output 
Смежные вопросы