我的 sql 在 ALTER TABLE ADD COLUMN 语句中使用了一个变量

my sql use a variable in the ALTER TABLE ADD COLUMN statement

您好,我想创建一个 table 并将日期作为列名。

我正在使用此代码将列添加到 table:

DROP PROCEDURE IF EXISTS filldates;
DELIMITER |
CREATE PROCEDURE filldates(dateStart DATE, dateEnd DATE)
BEGIN
  WHILE dateStart <= dateEnd DO
    ALTER TABLE dates
    ADD dateStart VARCHAR(30);

    SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
  END WHILE;
END;
|
DELIMITER ;
CALL filldates('2017-01-01','2017-12-31');

但是它将错误 dateStart 显示为重复内容,因为它创建了一个列 'dateStart' 而不是日期。 如何将 dateStart 用作变量。

当我使用 "INSERT INTO tablename (_date) VALUES (dateStart);" 而不是 ALTER TABLE 语句时,它没有显示任何错误,而是将日期插入数据库,但作为“_date”列中的行。我希望将日期添加为列名。

如何将 dateStart 用作变量

简短的回答是您不能将变量用作数据库、table 或 MySQL 中的列名。

您唯一可以做的就是将 sql 语句连接为字符串并将其作为 prepared statement.

执行
SET @s=CONCAT('ALTER TABLE dates ADD COLUMN `',dateStart,'` VARCHAR(30)');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

但是,向 table 中动态添加大量字段名称通常表示设计不当(除非您正在准备物化数据透视表 tables 以用于无法更改的数据中的报告目的) .

这将是您 Table 的添加列,但这不是一个好主意。

set @datestart = "2017-01-03";
set @sql = concat('Alter table tbl_1 Add Column `' ,@datestart, '`Varchar(30)');

PREPARE stmt from @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

如果你想要一个循环然后使用Cursor

我有同样的问题,这对我有用。

declare @colname varchar (128)
set @colname=convert(varchar,DATEPART(DAY,GetDate()))+'\'+convert(varchar,DATEPART(MONTH,GetDate()))+convert(varchar,DATEPART(YYYY,GetDate()))
exec ('ALTER TABLE temp ADD ['+@colname +'] int NULL')