MySQL存储过程错误-从参数名称创建表

MySQL存储过程错误-从参数名称创建表,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我正在尝试以下操作,但出现以下错误: ERROR 1054 (42S22): Unknown column 'f' in 'where clause' 我非常困惑,因为f是createtableTest的一个参数 CREATE PROCEDURE createtableTest ( tname2 varchar(20), f varchar(20) ) BEGIN DROP TABLE IF EXISTS tname2; CREATE TABLE tname2 as SELECT * FROM

我正在尝试以下操作,但出现以下错误:

ERROR 1054 (42S22): Unknown column 'f' in 'where clause'
我非常困惑,因为
f
createtableTest
的一个参数

CREATE PROCEDURE createtableTest
(
tname2 varchar(20),
f varchar(20)
)
BEGIN
DROP TABLE IF EXISTS tname2;
CREATE TABLE tname2 as SELECT * FROM data WHERE group_name like f;
END;

由于
f
is包含该值,因此需要一个动态sql,以便将其与原始查询连接起来

DELIMITER $$

CREATE PROCEDURE createtableTest(IN tname2 varchar(20),IN f varchar(20))
BEGIN
    DROP TABLE IF EXISTS tname2;
    SET @sql = CONCAT('CREATE TABLE tname2 as SELECT * FROM data WHERE group_name like ''%',f,'%''');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END $$

DELIMITER ;
例如,
f
的值为
hello
,连接的字符串将产生

CREATE TABLE tname2 as SELECT * FROM data WHERE group_name like '%hello%'
更新

除了串联,您还可以参数化值,这是最好的方法,例如

DELIMITER $$

CREATE PROCEDURE createtableTest(IN tname2 varchar(20),IN f varchar(20))
BEGIN
    DROP TABLE IF EXISTS tname2;
    SET @sql = CONCAT('CREATE TABLE tname2 as SELECT * FROM data WHERE group_name like ?');
    PREPARE stmt FROM @sql;
    SET @val = CONCAT('%', f, '%');
    EXECUTE stmt USING @val;
    DEALLOCATE PREPARE stmt;
END $$

DELIMITER ;

@JW웃 , 你到底编辑了什么?是否添加了
sql
标记?我很确定这个问题是MySQL特有的。谢谢。这确实回答了我的问题!