You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:57:16