2017-05-08 84 views
0

您好我正在创建一个日期为列名称的表。我的SQL在ALTER TABLE ADD COLUMN语句中使用变量

我使用此代码列添加到表:

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作为变量

+0

这将是你的表的设计不好。 –

回答

1

简短的回答是,你不能使用变量作为数据库,表,或在MySQL的列名。

您可以做的唯一事情是将sql语句连接为字符串并将其作为prepared statement执行。

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

然而,在大量动态添加字段名的表通常表示一个不好的设计(除非你正在准备物化透视表报告的目的出的数据是不能更改)。

+0

谢谢,这工作 – Abdulla

+0

只需要将您的代码的第2行@ s1更改为@s – Abdulla

0

这将成为你的表的添加列,但这不是一个好主意。

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

+0

1)没有说明为什么要使用上述代码2)代码与我提出的相同,因此不会增加额外的值3)游标用于循环选择的结果。这里没有必要使用一个。 – Shadow

+0

在我这样做之前,我用来测试你的代码,因为我想知道你没有使用@符号。而我的测试结果是返回给我一个错误..这就是为什么我生成另一个。你想让我删除这篇文章吗? –

+0

我没有使用@因为datestart是问题中存储过程的参数。在这种情况下无需使用@。 – Shadow

相关问题