.NET 7使用dbup执行MySQL存储过程脚本报错(SET MESSAGE_TEXT行)
解决DbUp执行MySQL存储过程脚本的语法错误问题
核心原因
DbUp默认以;作为SQL语句分隔符,但MySQL存储过程内部的;会被DbUp误判为脚本结束标记,导致脚本被提前截断,进而出现你遇到的“near ''”语法错误(本质是脚本未执行完整)。另外你的原脚本中第二个SELECT语句缺少FROM mytable子句,这也是潜在语法问题。
解决方案
1. 调整脚本的分隔符
在存储过程脚本开头临时切换分隔符(比如//),脚本结束后恢复默认分隔符,避免DbUp误截断。调整后的完整脚本示例:
DELIMITER // CREATE PROCEDURE UpdateCategory(IN categoryId INT, IN categoryName VARCHAR(255), IN description TEXT) BEGIN -- DECLARE必须放在BEGIN块最顶部 DECLARE trimmed_name VARCHAR(255); SET trimmed_name = REPLACE(TRIM(categoryName), ' ', ''); IF (SELECT COUNT(*) FROM mytable WHERE REPLACE(TRIM(name), ' ', '') = trimmed_name) > 0 AND (SELECT REPLACE(TRIM(name), ' ', '') FROM mytable WHERE id=categoryId) != trimmed_name THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Category with given name already exists'; ELSE UPDATE mytable SET name=categoryName, description=description WHERE id = categoryId; END IF; END // DELIMITER ;
2. 配置DbUp适配MySQL
在.NET代码中确保DbUp使用MySQL专属的执行器,避免分隔符处理异常:
var upgrader = DeployChanges.To .MySqlDatabase(connectionString) .WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly()) .LogToConsole() .Build(); var result = upgrader.PerformUpgrade();
关键注意事项
DECLARE声明变量必须放在BEGIN块的最顶部,MySQL要求变量声明逻辑优先于其他执行语句。- 存储过程脚本必须包含完整的
CREATE PROCEDURE/ALTER PROCEDURE定义,不能只保留内部BEGIN...END块。
内容的提问来源于stack exchange,提问作者Able
相关产品推荐
相关产品推荐

