MySQL 中SQL语句无法实现动态的使用表名做变量。只能通过PREPARE来实现动态SQL语句。
SET @sql = concat(' select * from a_',DATE_FORMAT(now(),'%y%m'));
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
- CONCAT 拼接SQL语句
- PREPARE预编译语句
- EXECUTE执行语句
- DEALLOCATE删除预编译资源
set @aa=concat('select * from ',"a_",(select substring(DATE_FORMAT(Date_add(now(), interval 0 day),'%Y%m'),3,4)));
prepare qq from @aa;
execute qq;
例1:
#动态表名
CREATE PROCEDURE ( table_name varchar(50))
begin
set @sql=concat('select * from ',table_name);
PREPARE stmt FROM @sql;
EXECUTE stmt ;
end
例2:
set @aa=CONCAT('select * from ',getApMonthTabName(8));# getApMonthTabName获得表名函数
prepare qq from @aa;
execute qq;
DROP PROCEDURE IF EXISTS pro_ap_month_dtl_day_;
CREATE PROCEDURE pro_ap_month_dtl_day_(in pvAverage VARCHAR (32),in tab_name VARCHAR (32))
BEGIN
set @STMT:=concat("INSERT INTO ",getApMonthTabName(tab_name), #动态表名
" SELECT * FROM wbo_ap_dtl_day a where id = 1");
PREPARE stmt FROM @STMT;
EXECUTE stmt ;
end;