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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:25:15