Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何从SQLServer中的存储过程中获取作为整数的输出响应_Sql Server_Tsql - Fatal编程技术网

Sql server 如何从SQLServer中的存储过程中获取作为整数的输出响应

Sql server 如何从SQLServer中的存储过程中获取作为整数的输出响应,sql-server,tsql,Sql Server,Tsql,我试图从存储过程中获取以下响应,以验证用户身份,并根据用户输入从存储过程中读取响应 CREATE Procedure sp_UserAuthentication @UserName varchar(20), @UserPassword varchar(20), @Resp int output AS DECLARE @Count int; DECLARE @IsAdmin bit; DECLARE @IsActive bit; Select @Count = COUNT(UserName) fr

我试图从存储过程中获取以下响应,以验证用户身份,并根据用户输入从存储过程中读取响应

CREATE Procedure sp_UserAuthentication
@UserName varchar(20),
@UserPassword varchar(20),
@Resp int output
AS
DECLARE @Count int;
DECLARE @IsAdmin bit;
DECLARE @IsActive bit;
Select @Count = COUNT(UserName) from tbl_UserDetails where UserName = @UserName and UserPassword = @UserPassword
IF @Count = 1
BEGIN


Select @IsActive = IsActive, @IsAdmin = @IsAdmin from tbl_UserDetails where UserName = @UserName and UserPassword = @UserPassword
IF @IsActive = 0 -- InActive user
BEGIN
    SET @Resp = 3
END
ELSE IF @IsAdmin = 1 -- Admin user
BEGIN
    SET @Resp = 2
END
ELSE -- Normal user
BEGIN
    SET @Resp = 1
END
END
ELSE -- InValid user
BEGIN 
   SET @Resp = 0
END

GO
我得到的响应总是1表示有效用户,0表示无效用户。我没有得到管理员2和非活动用户3的响应

DECLARE @Res int 
exec sp_UserAuthentication 'user', 'pwd', @Res out
SELECT @Res
表:

Create Table tbl_UserDetails(
UserName Varchar(20) primary key,
UserPassword Varchar(20) NOT NULL,
IsAdmin Bit Default 0,
IsActive Bit Default 1
);

让我们忽略将用户名和密码放入表中的事实。请不要这样做,如果这样做,请使用某种加密/哈希。但请看中间的SELECT语句:

Select @IsAdmin = @IsAdmin

您正在将@IsAdmin设置为@IsAdmin,您需要将其设置为刚才的IsAdmin

记住每个人对存储明文密码的严厉谴责。您迫切需要阅读并了解如何加密这些文件。但是你的整个过程可以大大简化成这样

CREATE Procedure UserAuthentication
(
    @UserName varchar(20),
    @UserPassword varchar(20),
    @Resp int output
)
AS
    set @Resp = 0 --This sets the response to invalid unless we actually find a user

    Select @Resp = 
        case when IsActive = 0 then 3 --Inactive User
            when IsAdmin = 1 then 2 --Admin user
            else 1 --Normal user
        end
    from tbl_UserDetails 
    where UserName = @UserName 
        and UserPassword = @UserPassword

这不是你问题的答案,但你有几个问题。首先是sp_uu前缀。这是一个糟糕的命名约定。你最好使用一个不同的,甚至更好的,没有前缀。另一个问题更为严重。您正在以明文形式存储密码。密码应该总是被加盐和散列。至于你的实际问题,我们不能在这里提供太多帮助,因为我们没有数据来处理。您是否有非活动用户?我认为您可以在select语句中使用case表达式,并避免所有复杂的If/Else逻辑来检查变量。向我们展示一些示例数据,它似乎对我有用,而不是使用框架的内置机制构建您自己的身份验证。你发布的内容存储了清晰的密码,这在当今是不可接受的。在过去的一年里,你不可能错过几十次违规行为!您需要存储和比较咸哈希。加密强散列需要数千次迭代。ASP.NET已经包含一个强大的身份验证机制,桌面应用程序也可以使用该机制。使用它谢谢各位,我会确保使用salt和hash形式的密码OP还可以在客户端返回行和检查字段,并使用连接而不是两个单独的查询。