将SQL Server的存储过程迁移到MySQL,关键在于理解T-SQL与MySQL存储过程语法之间的差异,并依据转换规则手动重构。直接照搬原脚本通常无法执行,需要逐项调整语法结构。

一、变量与参数声明差异
SQL Server使用DECLARE @var type声明变量,而MySQL在存储过程中使用DECLARE var type,不需要@符号。参数定义在CREATE PROCEDURE中也有所不同。
SQL Server原存储过程片段
CREATE PROCEDURE GetUserCount
@status int
AS
BEGIN
DECLARE @cnt int;
SELECT @cnt = COUNT(*) FROM users WHERE state = @status;
SELECT @cnt AS total;
END
MySQL手动重构后
CREATE PROCEDURE GetUserCount(IN p_status INT)
BEGIN
DECLARE v_cnt INT;
SELECT COUNT(*) INTO v_cnt FROM users WHERE state = p_status;
SELECT v_cnt AS total;
END
二、流程控制转换规则
SQL Server常用IF ... BEGIN ... END,MySQL同样支持IF ... THEN ... END IF;,但必须写完整结束符。循环方面,SQL Server的WHILE在MySQL中语法接近,但要注意LEAVE与ITERATE标签用法。
- SQL Server用
PRINT输出信息,MySQL用SELECT或SIGNAL模拟 - MySQL存储过程需显式设置
DELIMITER避免分号冲突 - 临时表在SQL Server为
#tmp,MySQL用CREATE TEMPORARY TABLE
三、错误处理与事务
SQL Server使用TRY...CATCH,MySQL通过DECLARE EXIT HANDLER FOR SQLEXCEPTION捕获异常。下面示例展示事务与异常处理的重构方式。
CREATE PROCEDURE TransferMoney(IN from_id INT, IN to_id INT, IN amt DECIMAL(10,2))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'transfer failed';
END;
START TRANSACTION;
UPDATE account SET balance = balance - amt WHERE id = from_id;
UPDATE account SET balance = balance + amt WHERE id = to_id;
COMMIT;
END
四、函数与系统特性替换
部分SQL Server函数需替换为MySQL等价物,例如GETDATE()改为NOW(),ISNULL()改为IFNULL()。字符串拼接由+变为CONCAT()。
| SQL Server | MySQL |
|---|---|
| GETDATE() | NOW() |
| ISNULL(a,b) | IFNULL(a,b) |
| TOP 1 | LIMIT 1 |
五、手动重构步骤总结
建议按以下顺序操作:备份原过程逻辑、逐段翻译声明与主体、替换系统函数、改写异常处理、本地用测试数据验证。手动重构虽繁琐,但能精准控制业务语义,避免自动转换带来的隐性错误。
迁移不是单纯改语法,而是把原有业务逻辑用MySQL的方式重新表达。
SQL_ServerMySQL存储过程迁移修改时间:2026-07-25 18:27:19