0

如何将以下代码转换为与 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
4

1 回答 1

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].

首先,这表明您有一个标识列(auto_increment在 MySQL 中)。但是,您没有列出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 语法编写它应该很容易。

于 2013-04-27T21:56:57.527 回答