如何将SQL Server过程转换为MySQL?

时间:2013-04-27 21:00:36

标签: mysql sql sql-server stored-procedures

如何将以下代码转换为与MySQL一起使用?我对MySQL有点熟悉但不熟悉SQL Server。

create procedure spInsertAccount
(
@AccountID INT,
@InUse bit,
@IsBanned bit,
@IsPremium bit,
@IsGolden bit,
@Username VARCHAR(20),
@Password VARCHAR(20),
@Email VARCHAR(65),
@LoggedInID INT,
@CreateDate DATETIME
)
AS
BEGIN TRANSACTION

IF NOT EXISTS( SELECT * FROM Accounts WHERE AccountID = @AccountID)
BEGIN
    INSERT INTO Accounts
    values(@AccountID,@InUse,@IsBanned,@IsPremium,@IsGolden,@Username,@Password,@Email,@LoggedInID,@CreateDate)

    select @@IDENTITY as [NewAccountID]
END

IF @@ERROR = 1 
ROLLBACK TRANSACTION
ELSE 
COMMIT TRANSACTION
GO

1 个答案:

答案 0 :(得分:1)

除了基本的语法约定之外,您正在测试是否存在记录,如果不存在则进行插入。这被包装在一个事务中,以确保条件和insert“看到”相同的数据库图片。

在两个数据库中,您可以通过执行以下操作来消除事务:

INSERT INTO Accounts(AccountID, InUse, IsBanned, IsPremium, IsGolden, Username, Password,
                    Email, LoggedInID, CreateDate
                   )
    select @AccountID, @InUse, @IsBanned, @IsPremium, @IsGolden, @Username, @Password,
          @Email, @LoggedInID, @CreateDate
    where NOT EXISTS( SELECT * FROM Accounts WHERE AccountID = @AccountID);

接下来,我对此声明有两个问题:select @@IDENTITY as [NewAccountID]

首先,这表明您有一个标识列(在MySQL中为auto_increment)。但是,您没有在insert语句中列出列。这意味着您可能在MS SQL中有错误,因为您(通常)无法将值插入标识列。无论如何,总是很好的做法,我列出了插入中的所有列。

其次,你永远不会使用这个值。所以,只是消除声明。

通过这些更改,MS SQL过程体变为:

as begin 
   INSERT INTO Accounts(AccountID, InUse, IsBanned, IsPremium, IsGolden, Username, Password,
                        Email, LoggedInID, CreateDate
                       )
        select @AccountID, @InUse, @IsBanned, @IsPremium, @IsGolden, @Username, @Password,
               @Email, @LoggedInID, @CreateDate
        where NOT EXISTS( SELECT * FROM Accounts WHERE AccountID = @AccountID);
 end;

这消除了我认为转换中棘手的部分。实际上从MySQL语法中写这个应该很容易。