在mysql的表名后面加上参数

smdnsysy  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(285)

我想写一个过程,在这个过程中按月收集数据并存储在一个表中。所以我要做的是将作为参数传递的月份的名称附加到表的名称中。
--这是我写的程序。

CREATE procedure month_data(IN month varchar(20))
BEGIN

declare monthName varchar(255);

set @monthName := concat('CREATE table IF NOT EXISTS monthName_"',month,'"
select * from dup_activity_log where monthname(cur_date)="',month,'";');
prepare stmt from @monthName;
execute stmt;

END //

/我得到一个运行时语法错误,但我不知道我应该做什么来删除它。我是mysql的新手,所以提前谢谢你的帮助/
错误1064(42000):您的sql语法有错误;查看与您的mysql服务器版本对应的手册,以获得正确的语法,以便在第1行的“june”select*from dup\u activity\u log where monthname(cur\u date)=“june”'附近使用

anauzrmj

anauzrmj1#

最好使用参数占位符 ? 为了 WHERE 子句而不是使用引号:

SET @sql = concat(
  'CREATE TABLE IF NOT EXISTS monthName_', month,
  ' SELECT * FROM dup_activity_log WHERE monthname(cur_date) = ?'  
  );

然后在执行时传递参数:

EXECUTE stmt USING @month;

请参阅程序外的完整代码:

SET @month = monthname(curdate());   
SET @sql = concat(
  'CREATE TABLE IF NOT EXISTS monthName_', @month,
  ' SELECT * FROM dup_activity_log WHERE monthname(cur_date) = ?'  
  );                    
PREPARE stmt FROM @sql;
EXECUTE stmt USING @month;
DEALLOCATE PREPARE stmt;
7y4bm7vi

7y4bm7vi2#

在表名的一部分周围有一些不必要的双引号。表名和select的开头之间应该有一个空格。试试这个( '' 被视为嵌入字符串中的单引号):

set @sql := concat(
    'CREATE table IF NOT EXISTS monthName_',
    month,
    ' select * from dup_activity_log where monthname(cur_date) = ''',
    month,
    ''';'
);

相关问题