2010-08-06 144 views
5

我正在尝试使用以下存储过程。我在这个MySQL存储过程中做了什么错误?

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` 
PROCEDURE `DeleteField`(IN _TABLENAME Text, IN _FIELDNAME text) 
BEGIN 
    if exists (select * from information_schema.Columns 
    where table_name = _TABLENAME and column_name = _FIELDNAME) 
    then 
    alter table _TABLENAME drop column _FIELDNAME; 
    end if; 
END 

因此,我调用(“anytable”,“Anyfield”),我得到的错误 错误代码:1146Table'Database._tablename'doesn't存在 这_tablename应该是我的参数,而不是字符串。

在我挂上自己之前,我有些帮助,我太爱我的生活了。

+1

圣彼得:“你是怎么死的? Skychaser:“MySQL查询......”圣彼得:“你的是什么?” – JYelton 2010-08-06 23:41:06

回答

5

我希望您需要创建一个动态SQL查询来完成此操作。

如何做到这一点的一个例子是:

http://www.java2s.com/Code/SQL/Procedure-Function/Createadynamicstatementinaprocedure.htm

这将是ALTER TABLE更换,虽然我已经测试了这一点。

DECLARE l_sql VARCHAR(4000); 
    SET l_sql=CONCAT_ws(' ', 
       'ALTER table ',_TABLENAME,' drop column ',_FIELDNAME); 
    SET @sql=l_sql; 
    PREPARE s1 FROM @sql; 
    EXECUTE s1; 
    DEALLOCATE PREPARE s1; 
+1

+1:绝对正确。 – 2010-08-07 01:07:36

+0

谢谢詹姆斯,你救了我的生命,我觉得我欠你一半的饼干什么的。真的,非常感谢你。 我仍然不知道为什么我必须使用动态过程,但我可以稍后保存这种理解,但任何链接都会非常感激。 :) – Skychaser 2010-08-08 11:58:34