MYSQL 8.0 -从INFORMATION_SCHEMA获取表列,COLUMNS返回其他无关列

tquggr8v  于 2023-04-19  发布在  Mysql
关注(0)|答案(1)|浏览(106)

我构建了一个存储过程,以JSON格式返回给定表和数据库的列列表。然而,它也返回其他表的列,尽管有WHERE子句-这没有意义,我不确定我做错了什么。非常感谢您的帮助。

USE `db-xyz`;

DROP PROCEDURE IF EXISTS GetColumnsInfo;

DELIMITER $$

CREATE
DEFINER = 'admin'@'localhost'
PROCEDURE GetColumnsInfo (IN table_name varchar(128),OUT columns_info json)
BEGIN

  SELECT
    JSON_OBJECTAGG(
    COLUMN_NAME,
    JSON_OBJECT(
    "column_name", COLUMN_NAME,
    "data_type", DATA_TYPE
    )
    ) AS columns_info
  INTO @columns_info
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = table_name;

  SET columns_info = @columns_info;
END
$$

DELIMITER ;

我是这样测试的:

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;
qacovj5a

qacovj5a1#

您应该将过程参数命名为不同于列名的名称。Column names are case-insensitive
现在,您的过程有一个带有以下条件的查询:

... AND TABLE_NAME = table_name;

这两个操作数都引用了表的列,而不是过程参数。MySQL不能告诉你后面的操作数是过程参数。
因此,它的计算结果为true,因为将列与其自身进行比较必然为true(除非该列为NULL)。

相关问题