Поскольку вопрос не в том, как хранить пароли в базе данных, я не буду затрагивать этот вопрос в этом ответе.
Первое, на что я должен указать, это то, что ваша процедура никогда не вернет значение3. Если параметр Email
не соответствует учетной записи, ваше условие возврата 0 всегда будет выполняться до того, как будет выполнено условие возврата 3. По этой причине я исключил его в этом ответе.
Если ваша цель состоит в том, чтобы избежать нескольких запросов внутри вашей хранимой процедуры (хорошая идея), вы можете выполнить ту же логику, используя один запрос и локальные переменные. Вот подтверждение концепции с использованием Microsoft SQL Server 2014.
CREATE TABLE AdminAccount (
Email VARCHAR(100),
Password VARCHAR(50),
IsActive BIT
)
INSERT INTO AdminAccount (Email,Password,IsActive) VALUES ('test@test.com','password',1)
INSERT INTO AdminAccount (Email,Password,IsActive) VALUES ('test2@test.com','password2',0)
INSERT INTO AdminAccount (Email,Password,IsActive) VALUES ('test3@test.com','password3',0)
SELECT * FROM AdminAccount
DECLARE @EmailParam VARCHAR(100) = 'test2@test.com'
DECLARE @PasswordParam VARCHAR(50) = 'password'
DECLARE @ReturnValue INT
DECLARE @LocalEmail VARCHAR(100)
DECLARE @LocalPassword VARCHAR(50)
DECLARE @LocalActive BIT
SELECT @LocalEmail = Email, @LocalPassword = Password, @LocalActive = IsActive FROM AdminAccount WHERE Email=@EmailParam
SET @ReturnValue =
CASE
WHEN @LocalEmail IS NULL AND @LocalPassword IS NULL
THEN 0 -- No User
WHEN @LocalPassword = @PasswordParam AND @LocalActive = 1
THEN 1 -- Active User
WHEN @LocalPassword = @PasswordParam AND @LocalActive = 0
THEN 2 -- Inactive User
WHEN @LocalPassword <> @PasswordParam
THEN 4 -- Invalid Password
END
SELECT @ReturnValue
Вот обновленная хранимая процедура с использованием приведенной выше логики локальной переменной.
CREATE PROCEDURE [dbo].[SP_Login]
@Email VARCHAR(100),
@Password VARCHAR(50),
@ReturnValue INT OUTPUT
AS
BEGIN
-- Declare local variables to avoid multiple queries
DECLARE @LocalEmail VARCHAR(100)
DECLARE @LocalPassword VARCHAR(50)
DECLARE @LocalActive BIT
-- Gather data
SELECT @LocalEmail = Email, @LocalPassword = Password, @LocalActive = IsActive FROM AdminAccount WHERE Email=@EmailParam
SET @ReturnValue =
CASE
WHEN @LocalEmail IS NULL AND @LocalPassword IS NULL
THEN 0 -- No User
WHEN @LocalPassword = @PasswordParam AND @LocalActive = 1
THEN 1 -- Active User
WHEN @LocalPassword = @PasswordParam AND @LocalActive = 0
THEN 2 -- Inactive User
WHEN @LocalPassword <> @PasswordParam
THEN 4 -- Invalid Password
END
END