2012-12-16 60 views
2

我有一個要求我保持一堆表不同的名字,如我可以使用MySQL變量來命名錶嗎?

2012_10_15_ncvoter68 
2012_11_15_ncvoter68 
2012_12_15_ncvoter68 

你的想法的工作流。

假設我剛創建了表2012_12_15_ncvoter68

我想查詢此表使用變量。例如,我可以定義一個變量:

SET @dt_ncv = CONCAT((SELECT DATE_FORMAT(CURDATE(), '%Y_%m_%d')),"_ncvoter68"); 

變量@dt_ncv計算得到字符串2012_12_15_ncvoter68

但我不明白如何(或如果有可能)使用此變量引用表。

查詢:

SELECT count(*) FROM @dt_ncv; 

簡單地給一個SQL語法錯誤。

我試着玩準備好的陳述,但似乎沒有幫助。

我希望你們中的一些MySQL大師能夠提供幫助!

+2

爲每個月設置一個不同的表格就是糟糕的設計 - 爲什麼不只有一個帶有日期列的表格? –

+1

semi dupe,same solution http://stackoverflow.com/questions/8363415/why-cant-i-use-a-variable-as-the-table-name-in-a-stored-procedure/8363487#8363487 – goat

回答

2

不,你不能那樣做。

您必須在程序語言中處理變量替換。

作爲手冊說(http://dev.mysql.com/doc/refman/5.1/en/user-variables.html)

用戶變量旨在提供數據值。它們不能是 直接在SQL語句中用作標識符或作爲 標識符的一部分,例如在表或數據庫名稱爲 的上下文中,或者作爲保留字(如SELECT)使用。

+1

你可以通過使用動態sql通過使用預處理語句來混淆字符串的執行來在sql中進行變量替換。 – goat

2

我通過舊版本的MySQL筆記看了一下,發現一個方法來做到這一點:

SET @dt_ncv = CONCAT((SELECT DATE_FORMAT(CURDATE(), '%Y_%m_%d')),"_ncvoter68"); 
SET @cntstmt = CONCAT_WS(" ", "SELECT count(*) FROM",@dt_ncv); 
PREPARE ncv_count_stmt FROM @cntstmt; 
EXECUTE ncv_count_stmt; 

這不是漂亮,這不是簡潔,但它的作品!

+0

我同意這不是很漂亮,如果您在數據表中爲日期(或月份)添加一列,則不需要。稍微重構一下,你可以更容易地使用設計。 –

相關問題