存储过程中的MySql-if-exists子句

存储过程中的MySql-if-exists子句,mysql,stored-procedures,Mysql,Stored Procedures,我正在根据我找到的教程编写程序的登录/注册模块。 一切正常,但后来我从MSSql切换到MySql数据库 问题是我无法重写插入程序。此过程接受用户名、密码和电子邮件3个参数,可以返回3个不同的值 -1如果用户名已被使用 -2如果电子邮件已被使用 如果注册成功,则为新行的id 我试着这样写: DELIMITER $$ CREATE PROCEDURE InsertUser( IN username VARCHAR(50), IN pass VARCHAR(255), IN e

我正在根据我找到的教程编写程序的登录/注册模块。 一切正常,但后来我从MSSql切换到MySql数据库

问题是我无法重写插入程序。此过程接受用户名、密码和电子邮件3个参数,可以返回3个不同的值

-1如果用户名已被使用 -2如果电子邮件已被使用 如果注册成功,则为新行的id

我试着这样写:

DELIMITER $$
CREATE PROCEDURE InsertUser(
    IN username VARCHAR(50),
    IN pass VARCHAR(255),
    IN email VARCHAR(50))
BEGIN
IF (SELECT Id FROM Users WHERE UserName=username) THEN
BEGIN
    SELECT -1;
END;
ELSEIF (SELECT Id FROM Users WHERE Email=email)
THEN
BEGIN
    SELECT -2;
END;
ELSE
BEGIN
    INSERT INTO Users (UserName, Password, RegDate, Email) VALUES(username, pass, CURDATE(), email);
    SELECT LAST_INSERT_ID();
END;
END IF;
END $$
DELIMITER ;
当我尝试使用Visual Studio中的上述代码创建此过程时,我得到了错误的语法。但是,如果我从phpmyadmin页面执行此操作,则不会出现错误。但它根本不起作用,不管我提供什么参数,它都不会返回任何结果。我正在使用phpmyadmin页面和executeprocedure选项来测试它

以下是原始的T-Sql代码:

CREATE PROCEDURE [dbo].[Insert_User]    
      @Username NVARCHAR(20),    
      @Password NVARCHAR(20),    
      @Email NVARCHAR(50)    
AS    
BEGIN    
      SET NOCOUNT ON;    
      IF EXISTS(SELECT Id FROM Users WHERE Username = @Username)    
      BEGIN    
            SELECT -1 -- Username exists.    
      END    
      ELSE IF EXISTS(SELECT Id FROM Users WHERE Email = @Email)    
      BEGIN    
            SELECT -2 -- Email exists.    
      END    
      ELSE    
      BEGIN    
            INSERT INTO [Users]    
                     ([Username]    
                     ,[Password]    
                     ,[Email]    
                     ,[RegDate])    
            VALUES    
                     (@Username    
                     ,@Password    
                     ,@Email    
                     ,GETDATE())                       
            SELECT SCOPE_IDENTITY() -- UserId 
     END    
END
有什么想法吗

与命令行和GUI客户端不同,在Connector/Net中创建存储过程时,不需要指定特殊的分隔符

MySQL命令行中的一个选项:

分隔符$$ 创建过程“InsertUser” 在`\u username`VARCHAR50中, 在“u pass”VARCHAR255中, 在``电子邮件` VARCHAR50中 开始 如果从'Users'中选择'Id',其中'UserName'='u UserName',则 选择-1; 否则,请从“用户”中选择“Id”,其中“电子邮件”=`U电子邮件` 选择-2; 其他的 在“用户”`UserName`、`Password`、`RegDate`、`Email`中插入` 值“%u username”、“u pass”、“CURDATE”、“email”; 选择最后一个插入ID; 如果结束; 结束$$ 定界符;
谢谢,但我自己解决了。我不知道为什么我这么想使用EXISTS函数:我去掉了它,现在它可以工作了:

BEGIN
    IF(SELECT Id FROM Users WHERE UserName=username) IS NOT NULL THEN
        SELECT -1;
    ELSEIF (SELECT Id FROM Users WHERE Email=email) IS NOT NULL THEN
        SELECT -2;
    ELSE
        INSERT INTO Users(UserName, Password, RegDate, Email) VALUES (username, pass, CURDATE(), email);
        SELECT LAST_INSERT_ID();
    END IF;
END

避免将变量和参数命名为表的列。我刚刚意识到我们的解决方案完全相同。谢谢