2010-01-26 79 views
0

我有一个存储过程是这样的:问题在存储过程结果

ALTER PROCEDURE [dbo].[CheckUser&Pass] 
(
    @Username nchar(15), 
    @Password nchar(15) 
) 
AS 
    SET NOCOUNT ON; 
SELECT  Username, Pass, Code_Person 
FROM   Login 
WHERE  (Username = @Username) AND (Pass = @Password) 

和执行:

DECLARE @return_value int 

EXEC @return_value = [dbo].[CheckUser&Pass] 
     @Username = N'admin', 
     @Password = N'1234' 

SELECT 'Return Value' = @return_value 

GO 

我想知道我怎么可以设置@return_Value为1时,用户名是admin密码是1234.

但它不能正常工作,这是可能的吗?

回答

5

要在存储过程中设置的返回值,你需要使用RETURN声明

例如

IF (@@ROWCOUNT > 0 AND @Username = 'admin' and password='1234') 
    RETURN 1 
ELSE 
    RETURN 0 

请注意,我已经给出了您刚刚要求的所有内容,只是为了演示如何使用RETURN语句。还有一些需要关注的我都应该指出:

  1. 你看上去采用明文存储的密码,如果是这样的话,是一个坏主意
  2. 的管理员用户名这一硬编码条件,密码组合太可怕了。一个更好的解决方案是在db中有一个“IsAdmin”标志 - 如果提供的用户名/密码有效,那么如果该标志指示该帐户是管理员,则返回1。
  3. 使用nchar - 所有用户名和密码将被填充为15个字符。你应该考虑nvarchar。
+0

就像我说的值存储过程,必须有一个更好的办法:) +1 – 2010-01-26 09:01:23

+0

是的,非常感谢它的工作原理 – kamiar3001 2010-01-26 09:24:10

1

你可以改变你的存储过程返回计数,假设用户名和密码是唯一的,你应该得到1或0的结果,但我认为必须有更好的方法。

ALTER PROCEDURE [dbo].[CheckUser&Pass] 
(
    @Username nchar(15), 
    @Password nchar(15) 
) 
AS 
    SET NOCOUNT ON; 
SELECT  Count(Username) 
FROM   Login 
WHERE  (Username = @Username) AND (Pass = @Password) 
0

你应该改变,以返回你想要

ALTER PROCEDURE [dbo].[CheckUser&Pass] 
(
    @Username nchar(15), 
    @Password nchar(15) 
) 
AS 
    SET NOCOUNT ON; 
    DECLARE @cnt INT 
    SELECT  @cnt = COUNT(*) 
    FROM   Login 
    WHERE  (Username = @Username) AND (Pass = @Password) 

    RETURN @cnt