SQL过程CREATE表,带有变量Tablename

时间:2016-03-12 12:33:15

标签: mysql sql procedure

我需要创建一个带有变量名的表。

继承我的代码,我不知道为什么它不起作用。

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'在'字段列表'

3 个答案:

答案 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

我发现这种方法更容易调试和维护。