首页 > 解决方案 > MySQL - 查询验证失败

问题描述

我有这个查询:

SELECT CONCAT('SELECT `user_id` FROM task_schedule WHERE `',DAYNAME(NOW()),'` = TRUE')
INTO @task;
PREPARE statement FROM @task;
EXECUTE statement;
DEALLOCATE PREPARE statement;

它用于查询此表:

CREATE TABLE `task_schedule` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `program_id` int(11) NOT NULL,
  `sunday` tinyint(2) DEFAULT NULL,
  `monday` tinyint(2) DEFAULT NULL,
  `tuesday` tinyint(2) DEFAULT NULL,
  `wednesday` tinyint(2) DEFAULT NULL,
  `thursday` tinyint(2) DEFAULT NULL,
  `friday` tinyint(2) DEFAULT NULL,
  `saturday` tinyint(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查询按预期工作。我使用了 MySQL Workbench 工具 JetBrains Datagrip,它也在命令行中工作。但是,每个在线 mysql 语法检查器都会使查询失败,并出现以下错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'PREPARE stmt FROM @query EXECUTE stmt; 附近使用的正确语法;第 3 行的 DEALLOCATE PREPARE stmt'

这对我来说是个问题,因为我使用第三方公司工具,它将对我们的数据库使用这个查询,他们也报告同样的错误。显然他们使用相似或相同的语法检查器。

这个查询有什么问题?

更多信息:

他的询问似乎没有什么问题。验证器出了点问题。

这个查询:

PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
 SET @a = 3;
 SET @b = 4;
 EXECUTE stmt1 USING @a, @b;

 DEALLOCATE PREPARE stmt1;

在任何地方都可以工作,除了验证器和我的情况。这取自官方文档

看起来验证器不支持 PREPARED 语句。

标签: mysql

解决方案


删除这一行:DEALLOCATE PREPARE 语句;它在运行之前取消查询!

编辑:这适用于示例 Mysql 数据库(sakila)

SELECT CONCAT('SELECT * FROM actor WHERE actor_id = 1')
INTO @task;
PREPARE statement FROM @task;
EXECUTE statement;
DEALLOCATE PREPARE statement;

推荐阅读