我的 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')
您好,我想创建一个 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')