mysql - 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 语句。
解决方案
删除这一行:DEALLOCATE PREPARE 语句;它在运行之前取消查询!
编辑:这适用于示例 Mysql 数据库(sakila)
SELECT CONCAT('SELECT * FROM actor WHERE actor_id = 1')
INTO @task;
PREPARE statement FROM @task;
EXECUTE statement;
DEALLOCATE PREPARE statement;
推荐阅读
- php - 如何在 intelephense 中定义一个未定义的函数(在 VSCode 中)?
- reactjs - 尝试导入错误:“useTranslation”未从“react-i18next”导出
- swift - 没有调用rewardedAdDidDismiss 函数
- python - 您如何检查列表中是否有新内容?(Python)
- python - 如何在 Python AST 中获取节点的下一个兄弟节点?
- amazon-web-services - 使用主键从 dynamo DB 表中获取大量数据
- python - 当他们给我错误时如何显示单个帖子(找不到与查询匹配的帖子)
- spring-integration - Spring Integration - Dispatcher 没有频道订阅者
- c# - 无法授权未经验证的应用程序
- r - 如何使用“if”、“else”在 R 中创建自定义函数以进行单位转换(例如,在 lbs 和 kg 之间)