Для этого вы можете использовать подготовленный оператор. Имя столбца не может быть переменной.
Процедура создания:
drop procedure if exists schema_change;
delimiter //
create procedure schema_change(in table_name_arg VARCHAR(40), in column_name_arg VARCHAR(40))
begin
if exists(select *
from information_schema.columns
where table_schema = schema()
and table_name = table_name_arg
and column_name = column_name_arg) then
SELECT CONCAT('ALTER TABLE TestResults drop column ',column_name_arg) INTO @sqlv;
PREPARE stmt FROM @sqlv;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end if;
end;
//
delimiter ;
Показать таблицу до:
MariaDB [bernd]> desc TestResults;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| x | int(11) | YES | | NULL | |
| y | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
Процедура вызова:
MariaDB [bernd]> call schema_change('TestResults', 'y');
Query OK, 0 rows affected (0.03 sec)
Показать таблицу после:
MariaDB [bernd]> desc TestResults;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| x | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
MariaDB [bernd]>