【发布时间】:2014-05-29 22:53:27
【问题描述】:
我正在 Mysql 中创建一个存储过程,其中我使用下面的准备好的语句从一个动态命名表中获取计数并尝试在 @a 中获取结果计数,但在运行时显示错误。
错误: 错误代码:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“NULL”附近使用正确的语法
SET prevDate=(CONCAT('details_',DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1
DAY),'%y%m%d')));
SET @qsql=CONCAT("SELECT COUNT(*) FROM ",prevDate," INTO @a");
PREPARE stmt FROM @qsql;
EXECUTE stmt;
SELECT @a AS detailcount ;
DEALLOCATE PREPARE stmt;
SET prevDate=(CONCAT('Subdetails_',DATE_FORMAT(DATE_SUB(CURDATE(),
INTERVAL 1 DAY),'%y%m%d')));
SET @qsql=CONCAT("SELECT COUNT(*) FROM ",prevDate," INTO @b");
PREPARE stmt FROM @qsql;
EXECUTE stmt;
SELECT @b AS Subdetails ;
DEALLOCATE PREPARE stmt;
SET totalcount=detailcount+Subdetails;
SELECT totalcount;
结果: 获取 totalcount=NULL , detailcount=NULL, Subdetails=Some value
这里有什么错误?
【问题讨论】:
-
为什么要使用准备好的语句?
-
要求动态命名表表明一个人的架构违反了Principle of Orthogonal Design。一般来说,不应该这样做。
-
如果需要,您可能希望按日期考虑 Partitioning 您的表格。
-
@eggyal 坦率地说,我不知道这个正交设计原则是什么。我只是想解决这个问题。你能帮我吗?
-
如果我不知道问题是什么,我无法帮助您解决问题。我能做的最好的就是告诉你不要使用动态命名的表,并猜测你可能是在分区之后。但是,我已经这样做了……
标签: php mysql stored-procedures mysqli prepared-statement