MySQL存储过程拼接变量与字符串作查询表名报错求助
问题原因
你遇到的错误是因为MySQL的静态SQL语法不允许直接用变量作为表名。当你写SELECT ... FROM concatenated时,MySQL会把concatenated当作真实存在的表名去查找,而不是你定义的字符串变量,所以才会提示表不存在。
解决方案
要实现用变量拼接表名并查询,必须使用动态SQL,通过PREPARE、EXECUTE和DEALLOCATE PREPARE三个步骤来完成。修改后的存储过程如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`() BEGIN DECLARE demo1 VARCHAR(100); DECLARE demo2 VARCHAR(100); DECLARE concatenated VARCHAR(100); DECLARE dynamic_sql VARCHAR(200); -- 新增变量存储动态SQL语句 SET demo1 = 'tour_'; SET demo2 = 'companytb'; SET concatenated = CONCAT('tour_', 'companytb'); -- 拼接动态SQL语句 SET dynamic_sql = CONCAT('SELECT DISTINCT company_name FROM ', concatenated); -- 准备并执行动态SQL PREPARE stmt FROM dynamic_sql; EXECUTE stmt; -- 释放准备好的语句,避免内存占用 DEALLOCATE PREPARE stmt; END
关键说明
PREPARE stmt FROM dynamic_sql:将拼接好的SQL语句编译成可执行的语句对象EXECUTE stmt:执行编译完成的动态SQL语句DEALLOCATE PREPARE stmt:执行完毕后释放语句资源,防止内存泄漏
如果后续你的变量内容来自外部输入,一定要做SQL注入防护,比如使用QUOTE()函数转义特殊字符;如果是固定拼接的字符串(比如当前例子),则无需额外处理。
内容的提问来源于stack exchange,提问作者Amrin
相关产品推荐
相关产品推荐

