2017-05-08 119 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

相關問題