我需要创建一个带有变量名的表。
继承我的代码,我不知道为什么它不起作用。
BEGIN
SET @tablename = tablename;
SET @sql_text = concat('CREATE TABLE ',@tablename,' (ID INT(11) NOT NULL, team0 DOUBLE NOT NULL, team1 DOUBLE NOT NULL)');
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
这是错误:
程序执行失败
1054 - 未知列' TestTableName'在'字段列表'
答案 0 :(得分:3)
用tablename
包裹'
表示它是字符串文字,而不是标识符。
BEGIN
SET @tablename = 'tablename';
SET @sql_text = concat('CREATE TABLE ',@tablename,' (ID INT(11) NOT NULL, team0 DOUBLE NOT NULL, team1 DOUBLE NOT NULL)');
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
的 SqlFiddleDemo
强>
请阅读CREATE TABLE @tbl,因为在运行时创建表可能表示设计不佳。
答案 1 :(得分:2)
BEGIN
SET @tablename = 'tablename';
SET @sql_text = concat('CREATE TABLE ',@tablename,' (ID INT(11) NOT NULL, team0 DOUBLE NOT NULL, team1 DOUBLE NOT NULL)');
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
答案 2 :(得分:0)
显然问题是表名本身和缺少引号(正如其他人所指出的那样)。编写此类代码时,您可以考虑使用replace()
而不是concat()
。这允许你这样做:
BEGIN
SET @tablename = 'tablename';
SET @sql_text = '
CREATE TABLE @tablename (
ID INT(11) NOT NULL,
team0 DOUBLE NOT NULL,
team1 DOUBLE NOT NULL
)';
REPLACE(@sql_text, '@tablename', @tablename);
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
我发现这种方法更容易调试和维护。