在一个 SQL 文件中合并两个或多个 MySQL 程序

Combining two or more MySQL procedures in one SQL file

我正在创建一个 c# 程序,它读取 .sql 文件并自动执行它。问题是,.sql 文件里面应该是一个程序。我创建了 20 多个程序。当我的 .sql 文件中只有一个过程时,我可以成功执行它。我如何将所有程序合并到一个 .sql 文件中?我尝试了以下方法:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateSettledMemo`(res_id varchar(45))
BEGIN
UPDATE memo_reservation SET reservation_memostat = 'SETTLED' WHERE
reservation_id = res_id;
END$$

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateUnsettledMemo`(res_id varchar(45))
BEGIN
UPDATE memo_reservation SET reservation_memostat = 'UNSETTLED' WHERE
reservation_id = res_id;
END$$

但没有创建任何内容。它返回的唯一错误是 MySql.Data.dll 中发生了 'MySql.Data.MySqlClient.MySqlException' 类型的未处理异常。命令执行期间遇到致命错误

解决此问题的一种方法是在 .sql 文件本身中使用定界符,但在 -- 之后使用它,这样 mysql 将忽略它作为注释。
例如,如果您的分隔符是 <NewQuery>,只需在 .sql 文件中写入 -- <NewQuery>
在您的 C# 程序中,您可以通过 -- <NewQuery> 分隔符和 运行 单独分割 .sql 文件。

.sql 文件中,删除每个过程开头的 DELIMITER $$。此外,在每个过程结束时,在 END 之后用分号 (;) 替换 $$.sql 文件中的查询应该是:

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateSettledMemo`(res_id varchar(45))
BEGIN
UPDATE memo_reservation SET reservation_memostat = 'SETTLED' WHERE
reservation_id = res_id;
END;

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateUnsettledMemo`(res_id varchar(45))
BEGIN
UPDATE memo_reservation SET reservation_memostat = 'UNSETTLED' WHERE
reservation_id = res_id;
END;

当您在连接中不允许使用变量时显示致命错误。 MySQL 看到@data 并希望找到名为@data 的参数。如果找不到,则会抛出异常。

要解决此问题,请将 allow user variables=true 添加到您的连接字符串。