Процедура SQL CREATE Table с переменной 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

И вот ошибка:

Не удалось выполнить процедуру

1054 - Неизвестный столбец «TestTableName» в «списке полей»


person Phil795    schedule 12.03.2016    source источник


Ответы (2)


Оберните 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, поскольку создание таблиц во время выполнения может указывать на плохой дизайн.

person Lukasz Szozda    schedule 12.03.2016

Очевидно, проблема заключается в самом имени таблицы и отсутствии кавычек (как отмечали другие). При написании кода такого типа вы можете использовать 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

Я считаю, что этот подход намного легче отлаживать и поддерживать.

person Gordon Linoff    schedule 12.03.2016
comment
Разве это не должно быть SET @sql_text = REPLACE(@sql_text, '@tablename', @tablename);? Без SET исходная переменная не изменится + нужно указать, что это переменная с @ (вероятно, опечатка). - person Lukasz Szozda; 12.03.2016