Как установить 2 рассчитанных выходных параметра в операторе выбора - PullRequest
0 голосов
/ 24 сентября 2018

Я создаю хранимую процедуру в SQL Server 2016, где в основном я собираюсь проверить комбинацию пользователя и пароля, чтобы узнать, является ли пользователь действительным, если да, то я хочу установить два параметра OUTPUT, один из которых содержит логическое значение, котороеозначает, что пользователь действителен (потому что позже в моем приложении я хочу проверить это значение bool), а другой, содержащий идентификатор пользователя.

Мой SPROC выглядит следующим образом

ALTER PROCEDURE [dbo].[uspLogin]
(
    @Email AS VARCHAR(200),
    @Password AS VARCHAR(200),
    @IsValid AS BIT OUTPUT,
    @UserId AS INT OUTPUT
)
AS
BEGIN

    SET NOCOUNT ON;

    BEGIN TRY


        BEGIN TRANSACTION;

        SELECT 
        @IsValid = (CASE WHEN COUNT(*) > 0 THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END),
        @UserId = (CASE WHEN COUNT(*) > 0 THEN CAST(U.UserId AS INT) ELSE CAST(-1 AS INT) END)
        FROM [dbo].[User] AS U
        INNER JOIN [dbo].[UserEnabled] AS UE ON U.UserId = UE.UserId
        WHERE U.Email = @Email AND U.Password = @Password

        COMMIT TRANSACTION;

    END TRY
    BEGIN CATCH

        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;

        DECLARE @ErrorMessage nvarchar(4000) = 'Error: [' + ERROR_MESSAGE() + '] in line [' + CAST(ERROR_LINE() AS varchar(1000)) + '] of procedure [' + ERROR_PROCEDURE() + ']';

        RAISERROR(@Errormessage, 18, 0);

    END CATCH;

END

После выполнения я получаю эту ошибку:

Столбец 'dbo.User.UserId' недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

1 Ответ

0 голосов
/ 24 сентября 2018

вы можете просто получить @UserId и проверить его значение.Если значение равно NULL, значит «Неправильно»

SELECT @UserId  = U.UserId 
FROM   [dbo].[User] AS U
       INNER JOIN [dbo].[UserEnabled] AS UE ON U.UserId = UE.UserId
WHERE  U.Email = @Email AND U.Password = @Password

SELECT @IsValid = CASE WHEN @UserId IS NULL THEN 0 ELSE 1 END

, в качестве альтернативы вы можете инициализировать @IsValid как ложное и установить в запросе TRUE

SELECT @IsValid  = 0

SELECT @UserId  = U.UserId,
       @IsValid = 1
FROM   [dbo].[User] AS U
       INNER JOIN [dbo].[UserEnabled] AS UE ON U.UserId = UE.UserId
WHERE  U.Email = @Email AND U.Password = @Password
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...