如何将 MS SQL Server 存储过程查询转换为 MySQL

举报
Tiamo_T 发表于 2021/11/25 19:17:49 2021/11/25
【摘要】 当您从 MS SQL 迁移到 MySQL 时,除了迁移数据之外,您还应该迁移驻留在数据库中的应用程序代码。

当您从 MS SQL 迁移到 MySQL 时,除了迁移数据之外,您还应该迁移驻留在数据库中的应用程序代码。

之前使用 WorkSQL Workbench 工具将 MS SQL 迁移到 MySQL 数据库,作为迁移的一部分,它只会转换表和复制数据,但不会转换触发器、视图和存储过程。您必须手动将这些转换为 MySQL 数据库。

要执行此手动转换,您需要了解 MS SQL 和 MySQL 查询之间的主要区别。

在我从 Microsoft SQL Server 到 MySQL 数据库的转换过程中,我遇到了以下 MS SQL 语句和查询,这些语句和查询与 MySQL 不兼容,我必须将它们转换为如下所示。

1. 存储过程创建语法

基本的存储过程创建语法本身是不同的。

MS SQL 存储过程创建语法:

CREATE PROCEDURE [dbo].[storedProcedureName]
@someString VarChar(150)
As
BEGIN
  --  Sql queries goes here 
END

MySQL 存储过程创建语法:


CREATE PROCEDURE storedProcedureName( IN someString VarChar(150) )
BEGIN
  -- Sql queries goes here
END

2. 临时表创建

在我的 MS SQL 代码中,我创建了几个应用程序所需的临时表。创建临时表的语法如下所示。

MS SQL 临时表创建语法:

CREATE TABLE #tableName( 
emp_id VARCHAR(10)COLLATE Database_Default PRIMARY KEY, 
emp_Name VARCHAR(50) COLLATE Database_Default, 
emp_Code VARCHAR(30) COLLATE Database_Default, 
emp_Department VARCHAR(30) COLLATE Database_Default 
)

MySQL临时表创建语法:

CREATE TEMPORARY TABLE tableName(
emp_id VARCHAR(10),
emp_Name VARCHAR(50),
emp_Code VARCHAR(30),
emp_Department VARCHAR(30)
);

3. IF条件

我在我的存储过程和触发器中使用了很多 IF 条件,它们在转换为 MySQL 后不起作用,因为语法不同,如下所示。

MS SQL IF 条件语法:

if(@intSomeVal='')
BEGIN
 SET @intSomeVal=10
END

MySQL IF 条件语法:

IF @intSomeVal=''	THEN
  SET @intSomeVal=10;
END IF;

4.IF EXIST条件

if 条件的另一个常见用途是检查查询是否返回任何行;如果它返回一些行,做一些事情。为此,我在 MS SQL 中使用了 IF EXISTS,它应该被转换为 MySQL IF 命令,如下所述。

MS SQL IF EXITS 示例:

IF EXISTS(SELECT 1 FROM #tableName WITH(NOLOCK) WHERE ColName='empType' ) 
BEGIN
  --  Sql queries goes here
END

使用 IF 条件的上述 MySQL 等价物:

IF(SELECT count(*) FROM tableName WHERE ColName='empType') > 0 	THEN
  --  Sql queries goes here
END IF;

5. 日期函数

在存储过程中使用数据函数是很常见的。下表给出了 MS SQL 和 MySQL 数据相关函数的区别。

MS SQL Server MySQL Server
GETDATE( ) NOW( )
SYSDATE( )
CURRENT_TIMESTAMP( )
GETDATE( ) + 1 NOW( ) + INTERVAL 1 DAY
CURRENT_TIMESTAMP +INTERVAL 1 DAY
DATEADD(dd, -1, GETDATE()) ADDDATE(NOW(), INTERVAL -1 DAY)
CONVERT(VARCHAR(19),GETDATE()) DATE_FORMAT(NOW(),’%b %d %Y %h:%i %p’)
CONVERT(VARCHAR(10),GETDATE(),110) DATE_FORMAT(NOW(),’%m-%d-%Y’)
CONVERT(VARCHAR(24),GETDATE(),113) DATE_FORMAT(NOW(),’%d %b %Y %T:%f’)
CONVERT(VARCHAR(11),GETDATE(),6) DATE_FORMAT(NOW(),’%d %b %y’)


6. 声明变量

在 MS SQL 存储过程中,您可以在“开始”和“结束”之间的任何位置声明变量。

但是,在 MySql 中,您必须在存储过程的“begin”语句之后声明它。不允许在两者之间的任何位置声明变量。

7. 选择前 N 行

在 MS SQL 中,当您只想选择前几条记录时,您将使用 SELECT TOP”。例如,要选择第 10 条记录,您将执行以下操作:

SELECT TOP 10 * FROM TABLE;

在 MySQL 中,您必须使用 LIMIT 而不是 TOP,如下所示。

SELECT * FROM TABLE LIMIT 10;

8. 整数转字符

在 MS SQL 中,您将执行以下操作(CONVERT 函数)将整数转换为字符。

CONVERT(VARCHAR(50),  someIntVal)

在 MySQL 中,您将使用 CAST 函数将整数转换为字符,如下所示。

CAST( someIntVal as CHAR)

9. 连接运算符

如果您在存储过程中处理大量数据,您可能正在执行一些字符串连接。

在 MS SQL 中,连接运算符是 + 符号。这种用法的示例如下所示。

SET @someString = '%|' + @someStringVal + '|%'

在 MySQL 中,如果使用 ansi 模式,则与 MS SQL 相同。即 + 符号将用于连接。

但是,在默认模式下,在 MySQL 中,我们需要使用 CONCAT( “str1”, “str2”, “str3”.. “strN”) 函数。

SET someString = CONCAT('%|', someStringVal, '|%');
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。