如何将 MS SQL Server 存储过程查询转换为 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, '|%');
- 点赞
- 收藏
- 关注作者
评论(0)