2013-03-28 35 views
5

爲什麼我得到這個錯誤?使用變量作爲表名的mysql錯誤

CREATE DEFINER=`root`@`localhost` PROCEDURE `selectrecords`(tablename varchar(50)) 
begin 
set @table_name=tablename; 
set @sql_text=concat('Select * from @table_name'); 
prepare statement from @sql_text; 
execute statement; 
deallocate prepare statement; 
end 

錯誤:

....to use near '@table_name' at line 1 

我的代碼是正確的,但我不明白爲什麼....

+0

我不認爲你可以使用變量對動態SQL中的表名。在Oracle中你肯定不能。我認爲你必須連接,看JW的答案 – Sebas

+0

@ Sebas:如果我使用「刪除frrom ....在哪裏」,JW的答案仍然可以接受? –

+0

是的,我想他幾乎回答了你所有的問題。 – Sebas

回答

4

我想你的意思,

CREATE PROCEDURE `selectrecords`(tablename varchar(50)) 
begin 
    set @sql_text = concat('Select * from ', tablename); 
    prepare statement from @sql_text; 
    execute statement; 
    deallocate prepare statement; 
end 

即使在動態 sql,你不能參數化表名和列名,這樣你的onl y的選擇是與字符串連接。只有值才能放在佔位符中。


更新1

CREATE PROCEDURE `selectrecords`(tablename varchar(50)) 
begin 
    set @val = idnumber; 
    set @sql_text = concat('Select * from ', tablename, ' WHERE id = ?'); 
    prepare statement from @sql_text; 
    execute statement USING @val; 
    deallocate prepare statement; 
end 
+0

如果我想在參數中包含id,該怎麼辦?讓我們說我想要這樣查詢「從表名刪除id = idnumber」? –

+0

'SET @sql ='從表名中刪除id =?'',您可以將'idnumber'的值放在一個佔位符中。 –

+0

我的意思是我仍在使用上面的代碼,但是這次使用where子句。如何concat包括哪裏? –