DELIMITER $$   
DROP PROCEDURE IF EXISTS CHECK_VAR$$   CREATE DEFINER='root'@'localhost' PROCEDURE CHECK_VAR(IN tablename VARCHAR(50),IN variable VARCHAR(50))BEGIN
SET @SQL=CONCAT('IF EXISTS (SELECT * FROM information_schema.columns where table_name=\'',tablename,'\' and column_name=\'',variable,'\') THEN RETURN "YES" ELSE RETURN "NO"');
PREPARE stmt FROM @SQL;   
  EXECUTE stmt;   
  DEALLOCATE PREPARE stmt;  
END$$DELIMITER ;CALL CHECK_VAR('fruits','f_id')出错

解决方案 »

  1.   

    create PROCEDURE CHECK_VAR(tablename VARCHAR(50),variable VARCHAR(50))
    BEGIN
    if EXISTS (SELECT * FROM information_schema.columns where table_name=tablename  and column_name=variable) 
    then
      select "YES"; 
    else
     select "NO";
    end if;
    end$mysql> call CHECK_VAR('test','a');
        -> $
    +----+
    | NO |
    +----+
    | NO |
    +----+
    1 row in set (0.00 sec)
      

  2.   

    用表名作变量名,难道不是动态sql语句?有时候很疑惑,什么时候该用concat连接,prepare execute执行
    什么时候直接就用sql语句
      

  3.   

    表名不能是变量名。 所以你只能用 prepare
      

  4.   

    我这个存储过程难道表名,字段名不是作的变量名吗?那为啥1L给出的没有用prepare呢?
      

  5.   

     (SELECT * FROM information_schema.columns where table_name=tablename  and column_name=variable)  
    显然,红色部分仅做一个WHERE中的变量,而不是表名和变量名。