存储过程结果中的问题

时间:2010-01-26 08:21:36

标签: sql-server stored-procedures

我有这样的商店程序:

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

我想知道如果用户名为admin且密码为1234,我可以将@return_Value设置为1。

但它无法正常工作,可能吗?

3 个答案:

答案 0 :(得分:5)

要在存储过程中设置返回值,您需要使用RETURN语句

e.g。

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

请注意,我已经准确地说明了您要求使用RETURN语句的要求。我应该指出一些问题:

  1. 看起来你是用纯文本存储密码,如果是这样的话,这是一个坏主意
  2. 管理员用户名和密码组合的硬编码条件非常糟糕。一个更好的解决方案是在数据库中有一个“IsAdmin”标志 - 如果提供的用户名/密码有效,那么如果该标志表明该帐户是管理员,则返回1。
  3. 使用nchar - 所有用户名和密码将填充为15个字符。您应该考虑使用nvarchar。

答案 1 :(得分: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)

答案 2 :(得分: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