将 SQL Server 存储过程重写为 MySQL(MariaDB)

Posted

技术标签:

【中文标题】将 SQL Server 存储过程重写为 MySQL(MariaDB)【英文标题】:Rewrite SQL Server Stored Procedure to MySQL(MariaDB) 【发布时间】:2019-01-20 01:02:48 【问题描述】:

我需要将存储过程从 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

它检查用户是否存在于用户表中,以及他最初登录的时间是否超过 7 天。

【问题讨论】:

正如您所发现的,不同品牌的数据库服务器的存储代码语言彼此之间有很大的不同。移植存储过程的最佳选择是使用相同的规范从头开始实现它们。这是供应商让客户锁定其产品的一种方式。 你试过了吗???发布您的代码。您是否阅读过有关如何创建 sp 的 MySQL 文档??? @Eric Sir,您错过了“我已经为此苦苦挣扎了好几个小时”这句话。这意味着,当我尝试从头开始重写它时,正如 O. Jones 所建议的那样,我什至无法成功编译前 5 行而没有错误。我不知道发布这 5 行错误的 MySQL 会如何改进这篇文章。 【参考方案1】:

存储过程语言的实现各不相同。 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 SP 中没有返回值。我不得不改用输出参数。 函数有返回值。存储过程通过输出变量返回结果集(行+列)或值。您的 MS SQL Server 过程返回结果集(单个 0 或 1)。提供的 MySQL 程序工作原理相同,无需使用输出变量。 (错误:检查v_first_launch 的设置方式。) 如果不是基于 8 天的 0/1 回报,整个过程归结为一个 INSERT .. ON DUPLICATE KEY UPDATE .. 语句。 @RickJames,v_first_launch 设置正确。它只有在找到用户时才有价值,并且只有在那时才使用。第二条评论是正确的,只是问题是关于过程语法,而不是逻辑。

以上是关于将 SQL Server 存储过程重写为 MySQL(MariaDB)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:更改存储过程以接受参数

将存储过程从 MS SQL Server 转换为 Informix

将 SQL Server 存储过程转换为 Oracle 过程以从表中查询

如何在 Microsoft PowerBI 中使用 SQL Server 存储过程?

锁定 SQL Server 存储过程

SQL Server 存储过程和触发器