我需要将存储过程从 MS SQL Server 语法重写为 MariaDB 标准的 MySQL。我已经为此苦苦挣扎了几个小时。我从来没有想过会有这么多的差异。有什么工具可以自动完成吗?这是存储过程的代码
CREATE PROCEDURE sp_Validate @username nvarchar(50), @email nvarchar(100) = NULL
AS
BEGIN
SELECT * INTO #tmp FROM Users WHERE Username = @username
IF((SELECT COUNT(*) FROM #tmp) < 1)
BEGIN
INSERT INTO Users(Username, Email, FirstLaunch) VALUES (@username, @email, GETDATE())
SELECT 1
END
ELSE IF(DATEDIFF(DAY, GETDATE(), (SELECT FirstLaunch FROM #tmp)) > 8)
BEGIN
UPDATE Users SET Email = @email WHERE Username = @username
SELECT 0
END
ELSE
BEGIN
UPDATE Users SET Email = @email WHERE Username = @username
SELECT 1
END
IF OBJECT_ID('#tmp') IS NOT NULL
DROP TABLE #tmp
END
它检查用户是否存在于 Users 表中,以及他是否在超过 7 天前首次登录。
最佳答案
存储过程语言的实现各不相同。 MS SQL Server 的语言 (Transact-SQL) 最初是由 Sybase 开发的。 MySQL 的方言有点不同。并不是真正的客户锁定,只是随着时间的推移发生了变化。
要在 MySQL 中实现该过程,您可以使用:
CREATE PROCEDURE sp_Validate(
in_username varchar(50),
in_email varchar(100)
)
begin
declare v_cnt int;
declare v_first_launch datetime;
select 1, FirstLaunch into v_cnt, v_first_launch
from Users
where Username = in_username;
if (v_cnt = 1) then
update Users
set Email = in_email
where Username = in_username;
if (datediff(now(), v_first_launch) > 8) then
select 0;
else
select 1;
end if;
else
insert into Users(Username, Email, FirstLaunch)
values (in_username, in_email, now());
select 1;
end if;
end
关于mysql - 将 SQL Server 存储过程重写为 MySQL(MariaDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51819953/