MySQL存储过程未返回正确的结果

MySQL存储过程未返回正确的结果,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我有一个存储过程,它检查用户是否已经存在,而不管电子邮件的输入是什么,它会返回数据库中的第一行。如果手动运行select语句,则会得到正确的结果。有什么建议吗 CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN `Email` VARCHAR(30)) BEGIN DECLARE User_ID INT(30); SELECT `User ID` INTO User_ID FROM `Users

我有一个存储过程,它检查用户是否已经存在,而不管电子邮件的输入是什么,它会返回数据库中的第一行。如果手动运行select语句,则会得到正确的结果。有什么建议吗

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN `Email` VARCHAR(30))
BEGIN
    DECLARE User_ID INT(30);
        SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = Email LIMIT 1;

    IF (User_ID > 0) THEN
        SELECT * FROM `Users` WHERE `User ID` = User_ID;
    ELSE
        SELECT concat('No Users Found: ', Customer_Name);
    END IF;
END

毫无疑问,你的问题在于:

SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = Email LIMIT 1;
惠特;参数名称与列名相同。这实际上是可行的,但让它这样做的规则可能很奇怪。(我想如果你把引号换过来,可能会有用)

但实际上,您应该将
Email
参数重命名为其他参数:

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN `EmailAddress` VARCHAR(30))
BEGIN
    DECLARE User_ID INT(30);
        SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = EmailAddress  LIMIT 1;

    IF (User_ID > 0) THEN
        SELECT * FROM `Users` WHERE `User ID` = User_ID;
    ELSE
        SELECT concat('No Users Found: ', Customer_Name);
    END IF;
END

问题在于变量的名称为
email
,与列相同。因此,
email=email
基本上是一个no-op,因为它只指列名

最好在参数前面加上前缀,以避免这种混淆:

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN v_Email VARCHAR(30))
BEGIN
    DECLARE v_User_ID INT(30);
    SELECT `User ID` INTO User_ID FROM `Users` u WHERE u.Email = v_Email LIMIT 1;

    IF (User_ID > 0) THEN
        SELECT * FROM `Users` WHERE `User ID` = v_User_ID;
    ELSE
        SELECT concat('No Users Found: ', Customer_Name);
    END IF;
END

您是否可以添加一些示例数据,显示您期望获得的内容与实际获得的内容?用户ID是哪种列命名?您似乎已将参数
Email
命名为与列
Email
相同的名称。尝试将参数名称更改为其他名称。@almasshaikh显然不是一个很好的字段名称选择,但只要它是这样引用的,它就可以工作。谢谢@AndrewBarber我不知道你可以在列中使用空格,但你让我开心。是的,我今天学到了新东西:)