Если из моего первоначального комментария было непонятно, создание таких таблиц почти никогда не является хорошей идеей.
Но если нужно, вот несколько способов ...
Попробуйте заменить / переставить эту часть (из исходного вопроса / проблемы):
DROP TABLE IF EXISTS Table_B;
while done = 0 do
fetch next from CurA into col;
if done = 0 then
set @SQL_TXT = concat('CREATE TABLE Table_B (',col1,' varchar(255))');
-- select @SQL_TXT
PREPARE stmt_name FROM @SQL_TXT;
EXECUTE stmt_name;
DEALLOCATE PREPARE stmt_name;
end if;
end while;
close curA;
с / как-то так:
DROP TABLE IF EXISTS Table_B;
SET @SQL_TXT = '';
while done = 0 do
fetch next from CurA into col;
if done = 0 then
set @SQL_TXT = concat(@SQL_TXT, ', `', col1, '` varchar(255)');
end if;
end while;
close curA;
SET @SQL_TXT = CONCAT('CREATE TABLE Table_B (', SUBSTRING(@SQL_TXT, 2), ')');
PREPARE stmt_name FROM @SQL_TXT;
EXECUTE stmt_name;
DEALLOCATE PREPARE stmt_name;
Цикл строит ваш список полей, SUBSTRING () удаляет ведущие ',', а конечный конкат объединяет список полей с фактическим CREATE.
Или вы можете просто построить запрос следующим образом:
SET @SQL_TXT
= SELECT CONCAT('CREATE TABLE Table_B ('
, GROUP_CONCAT(CONCAT('`', col, '` VARCHAR(255)') SEPARATOR ',')
, ');' AS theQuery
FROM Table_A
;
Также не в обоих случаях я разделял имя поля символом `; имена полей, такие как «123», не могут использоваться без разделителей.