SQL 过程 CREATE Table 变量 Tablename

SQL Procedure CREATE Table with variable Tablename

我需要用变量名创建 table。

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

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

这里是错误:

Procedure execution failed

1054 - Unknown column 'TestTableName' in 'field list'

' 包裹 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 因为在运行时创建表可能表明设计不佳。

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

显然问题出在 table 名称本身和缺少引号(正如其他人所指出的)。编写此类代码时,您可以考虑使用 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

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