Mysql - 存储过程参数中的表名

时间:2013-07-09 15:10:56

标签: mysql stored-procedures

好的,所以这就是我的尝试。我可以毫无问题地执行此代码:

    CREATE DEFINER=`dbname`@`%.domain.com` PROCEDURE `test4`(_sort character(2), 
_start int, _page int, _seek varchar(64))

begin
    select * from TABLE_OF_NAMES where

        first_name like coalesce(concat('%', _seek, '%'), first_name) or
        last_name like coalesce(concat('%', _seek, '%'), last_name)   
        and email in (select * from TempTable_emails)

   order by

        case when _sort = 'fa' then first_name end asc,
        case when _sort = 'fd' then first_name end desc,
    limit _start, _page;
end

现在我希望TempTable_emails表的名称应该是该过程的参数。我尝试以下方法:

    CREATE DEFINER=`dbname`@`%.domain.com` PROCEDURE `test4`(_sort character(2),
 _start int, _page int, _seek varchar(64),  _tablename varchar(64))
    begin

  set @a = concat(' select * from TABLE_OF_NAMES where
    first_name like coalesce(%', _seek, '%), first_name) or
    last_name like coalesce(%', _seek, '%), last_name)  and
    email in (select * from ',_tablename,')
    order by
    case when \'',_sort,'\' = \'fa\' then first_name end asc,
    case when \'',_sort,'\' = \'fd\' then first_name end desc,
    limit _start, _page;');

prepare stmt1 FROM @a;
execute stmt1;
deallocate prepare stmt1;
end

然而,这只会产生错误“您的SQL语法中有错误;请查看与您的MySQL服务器版本对应的手册,以便在'%gauss%'附近使用正确的语法),first_name)或last_name,如coalesce(% NAME%),last_name)和'at line 2“

我觉得我可能应该看看错误是什么,但我无法让它发挥作用......有人立即看到我的错误是什么吗?

是否还有其他(可能更容易)的解决方法来实现我想要实现的目标?

谢谢!

1 个答案:

答案 0 :(得分:0)

like coalesce(%', _seek, '%), first_name)

不会导致

like coalesce(concat('%', _seek, '%'), first_name)

这会产生类似的结果;

like coalesce(%gauss%), first_name)

其中,%gauss%周围没有引号是无效的SQL,而你似乎已经丢失了某个地方的concat