如何将以下代码转换为与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
答案 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语法中写这个应该很容易。