MySQL 8.0存储过程查询指定表列却返回无关列求助
问题原因与解决方案
核心问题
你的存储过程返回其他表列的根源是输入参数名table_name和INFORMATION_SCHEMA.COLUMNS表中的TABLE_NAME字段名冲突。MySQL默认不区分大小写,WHERE TABLE_NAME = table_name会被解析成“字段TABLE_NAME等于自身”,相当于没有添加表名过滤条件,自然会返回当前数据库下所有表的列信息。
另外,你用会话变量@columns_info做中间存储,这个变量是会话级别的,如果之前调用过存储过程且未清空,后续调用时若查询返回NULL(比如传入不存在的表名),会保留旧值,也可能导致结果不符合预期。
修正后的存储过程
修改参数名避免冲突,同时直接将结果写入OUT参数,去掉冗余的会话变量:
USE `db-xyz`; DROP PROCEDURE IF EXISTS GetColumnsInfo; DELIMITER $$ CREATE DEFINER = 'admin'@'localhost' PROCEDURE GetColumnsInfo (IN p_table_name varchar(128),OUT columns_info json) BEGIN SELECT JSON_OBJECTAGG( COLUMN_NAME, JSON_OBJECT( "column_name", COLUMN_NAME, "data_type", DATA_TYPE ) ) INTO columns_info FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_table_name; END $$ DELIMITER ;
关键修改点
- 将输入参数名改为
p_table_name,彻底避免与TABLE_NAME字段名的解析冲突; - 移除中间会话变量
@columns_info,直接把查询结果写入OUT参数,防止会话变量残留旧值导致的错误。
测试代码无需修改
你原来的测试代码可以直接使用,调用时传入目标表名即可得到正确的指定表列信息:
USE `db-xyz`; SET @table_name = 'Client'; SET @columns_info = ''; CALL GetColumnsInfo(@table_name, @columns_info); -- Display the output SELECT @columns_info AS columns_info;
内容的提问来源于stack exchange,提问作者EdsonF
相关产品推荐
相关产品推荐

