使用变量作为表名时出现的mysql错误

5

为什么我会收到这个错误?

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

我的代码是正确的,但我不明白为什么....


我认为你不能在动态 SQL 中使用变量作为表名。在 Oracle 中根本不行。我认为你必须要连接起来,可以参考 JW 的回答。 - Sebas
是的,我认为他基本上回答了你所有的问题。 - Sebas
我在这里遇到了错误:"set @sql_text = concat('Delete from ', tablename, 'WHERE id = pid');" "pid int"--> 已包含在参数中.. 有什么帮助吗? - Handy Manny
在 WHERE 前添加一个空格。 - Sebas
我在 Where 子句部分真的出现了错误。 - Handy Manny
显示剩余2条评论
1个回答

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 中,您也无法将表名和列名作为参数化,因此您唯一的选择是将其与字符串拼接。只有值可以放置在占位符中。


更新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

如果我想在参数中包含id怎么办?比如说我想查询像这样的语句“Delete from tablename where id =idnumber”? - Handy Manny
1
谢谢!你真的是个极客 :) - Handy Manny
还有一件事,我想在我的参数中包括'id int'并从我的数据库中删除一条记录,这样做对吗?"SET @sql=concat('Delete from', tablename,' Where id=pid'); - Handy Manny
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/27110/discussion-between-handy-manny-and-j-w - Handy Manny
在第二个查询(UPDATE 1)中,存储过程的第二个参数不应该是idnumber吗?还是它从全局变量中获取? - Tomas
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接