MySQL中如何在存储过程内调用存储过程?Access转库遇报错
Access转MySQL:存储过程中调用其他存储过程的解决方案
你的错误原因很明确:MySQL不能直接在FROM子句中把存储过程当作表来使用,你写的FROM YearCurrentPulledOut会让MySQL误以为这是一张物理表,所以抛出了表不存在的错误。
下面提供两种适配MySQL的实现方案,对应你类似Access查询嵌套的需求:
方案1:用临时表中转存储过程的结果
如果YearCurrentPulledOut必须以存储过程形式存在,你需要先将它返回的结果存入临时表,再用临时表做关联查询:
CREATE DEFINER=`root`@`localhost` PROCEDURE `BigDitchCurrentYear`() BEGIN -- 先清理可能存在的临时表(避免重复创建报错) DROP TEMPORARY TABLE IF EXISTS TempYearPulledOut; -- 创建与存储过程返回字段匹配的临时表 CREATE TEMPORARY TABLE TempYearPulledOut ( YearPulledOut INT -- 这里要和YearCurrentPulledOut返回的字段类型完全一致 ); -- 调用目标存储过程,将结果插入临时表 INSERT INTO TempYearPulledOut CALL YearCurrentPulledOut(); -- 执行原本的关联查询,用临时表替代存储过程 SELECT `BigDitchCurrentYearSub`.`BigDitchID`, `BigDitchCurrentYearSub`.`BeginDate`, `BigDitchCurrentYearSub`.`EndDate`, `BigDitchCurrentYearSub`.`Amount` FROM TempYearPulledOut INNER JOIN `BigDitchCurrentYearSub` ON TempYearPulledOut.`YearPulledOut` = `BigDitchCurrentYearSub`.`YearNow`; -- 临时表会在会话结束后自动销毁,也可以手动清理 DROP TEMPORARY TABLE IF EXISTS TempYearPulledOut; END
方案2:改用视图(更贴近Access查询嵌套的逻辑)
如果YearCurrentPulledOut只是单纯的查询逻辑(没有复杂的流程控制),建议把它改成视图,视图在MySQL中是虚拟表,可以直接在FROM或JOIN中使用,和Access里的查询嵌套用法完全一致:
- 先创建视图替代原存储过程:
CREATE VIEW YearCurrentPulledOut AS -- 这里写入原YearCurrentPulledOut存储过程中的查询逻辑 -- 示例:假设原存储过程是返回当前年份 SELECT YEAR(CURDATE()) AS YearPulledOut;
- 你的原存储过程代码可以直接使用,无需修改:
CREATE DEFINER=`root`@`localhost` PROCEDURE `BigDitchCurrentYear`() BEGIN SELECT `BigDitchCurrentYearSub`.`BigDitchID`, `BigDitchCurrentYearSub`.`BeginDate`, `BigDitchCurrentYearSub`.`EndDate`, `BigDitchCurrentYearSub`.`Amount` FROM `YearCurrentPulledOut` INNER JOIN `BigDitchCurrentYearSub` ON `YearCurrentPulledOut`.`YearPulledOut` = `BigDitchCurrentYearSub`.`YearNow`; END
总结
- 若仅需纯查询嵌套,优先用视图,用法和Access的查询最接近,实现成本最低。
- 若必须使用存储过程(比如包含分支、循环等流程逻辑),则通过临时表中转结果的方式实现调用。
内容的提问来源于stack exchange,提问作者JDubs
相关产品推荐
相关产品推荐

