mysql中如何将全文语句的变量值传递给存储过程?

mysql中如何将全文语句的变量值传递给存储过程?,mysql,stored-procedures,full-text-search,Mysql,Stored Procedures,Full Text Search,我完全被它卡住了: SET @req='sometingToFind' SELECT COUNT(id) FROM mytable WHERE MATCH(descr) AGAINST(@req IN BOOLEAN MODE); 这很好,但当我在存储过程中执行同样的操作时,声明如下: CREATE PROCEDURE `search_proc`(tn VARCHAR(32), r VARCHAR(60)) BEGIN SELECT COUNT(id) FROM tn WHERE MATCH(

我完全被它卡住了:

SET @req='sometingToFind'
SELECT COUNT(id) FROM mytable WHERE MATCH(descr) AGAINST(@req IN BOOLEAN MODE);
这很好,但当我在存储过程中执行同样的操作时,声明如下:

CREATE PROCEDURE `search_proc`(tn VARCHAR(32), r VARCHAR(60))
BEGIN
SELECT COUNT(id) FROM tn WHERE MATCH(descr) AGAINST(r IN BOOLEAN MODE);
END
然后运行它:

SET @req='sometingToFind'
CALL search_proc('mytable','@req');
我犯了一个错误,错误解释了引文

> ERROR 1146 (42S02): Table 'mybase.tn' doesn't exist

我尝试了各种替代方法,在存储过程和其他程序中用'r'替换r,但所有这些都不起作用

如果ypu希望将标识符名称传递给过程并在查询中使用它们,那么您应该将查询构建为字符串,然后使用准备好的语句执行它


.

动态表名问题再次出现。我个人不喜欢也不赞成在过程中使用动态表名,因此我的建议是:不要这样做

现在来看看如何做:您必须在存储过程中创建一个准备好的语句,然后执行它。这就是如何防止表名被引用,从而导致错误的解释

CREATE PROCEDURE `search_proc`(tn VARCHAR(32), r VARCHAR(60))
BEGIN

SET @dynamic_sql = CONCAT('SELECT COUNT(id) FROM ', tn, ' WHERE MATCH(descr) AGAINST(? IN BOOLEAN MODE);');
SET @match_against = r;

PREPARE stmt FROM @dynamic_sql;
EXECUTE stmt USING @match_against;
DEALLOCATE PREPARE stmt;

END

非常感谢。这很有效。但是有点输入错误<代码>使用@match_对执行stmt如果动态表名不好,我应该如何在多个表中发出搜索请求?我使用php+mysql环境。直接从php构建一个准备好的语句?数据库不应该使用动态表,我之所以说它不应该在db级别,是因为它会成为维护的噩梦。