前言不少企业存在.NET 老项目使用 SQL Server新项目改用 MySQL跨数据库迁移时大量语法不兼容批量报错。本文整理最常用、迁移必改的语法差异附带替换方案数据库迁移直接对照修改。一、基础标识、注释、字符串表 / 字段包裹符号MySQL反引号userSQL Server方括号[user]字符串统一单引号两者通用注释--、#仅 MySQL 支持SQL Server 不识别#统一用--。二、自增主键-- MySQL id INT PRIMARY KEY AUTO_INCREMENT -- SQL Server id INT IDENTITY(1,1) PRIMARY KEY三、分页语法最大迁移坑点-- MySQL LIMIT SELECT * FROM user LIMIT 0,10; -- SQL Server 2012 OFFSET FETCH SELECT * FROM user ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY; -- SQL Server 旧版本 TOP 分页 SELECT TOP 10 * FROM (SELECT TOP 20 * FROM user ORDER BY id) t ORDER BY id DESC;四、时间函数差异获取当前时间-- MySQL NOW() / CURRENT_TIMESTAMP -- SQL Server GETDATE() / CURRENT_TIMESTAMP日期格式化-- MySQL DATE_FORMAT(create_time,%Y-%m-%d) -- SQL Server CONVERT(VARCHAR,create_time,23)五、字符串拼接-- MySQL CONCAT(name,phone) -- SQL Server name phone -- 兼容写法 CONCAT(name,phone)六、条件判断函数-- MySQL IF() SELECT IF(sex1,男,女) FROM user; -- SQL Server CASE / IIF SELECT IIF(sex1,男,女) FROM user;七、分页、限制条数-- MySQL LIMIT 10 SELECT * FROM user LIMIT 10; -- SQL Server TOP 10 SELECT TOP 10 * FROM user;八、批量插入-- MySQL 多VALUES INSERT INTO user(name) VALUES (a),(b); -- SQL Server 2008支持低版本只能单行插入九、分页、别名、子查询SQL Server 子查询必须给表别名MySQL 允许省略SQL Server 不支持SELECT * FROM table WHERE id IN (SELECT id)无别名的老旧版本关联更新语法完全不同。关联更新对比-- MySQL UPDATE user u JOIN order o ON u.ido.user_id SET u.nametest; -- SQL Server UPDATE u SET u.nametest FROM user u INNER JOIN order o ON u.ido.user_id十、迁移通用避坑清单替换所有[]为或直接删除标识符号IDENTITY 改为 AUTO_INCREMENTTOP 分页统一改为 LIMITGETDATE () 替换 NOW ()日期格式化函数重写关联 UPDATE、DELETE 语法重构SQL Server 独有存储过程、触发器、函数重写适配 MySQL排序规则、字符集统一改为 utf8mb4。