mysql错误使用变量作为表名

Posted

技术标签:

【中文标题】mysql错误使用变量作为表名【英文标题】:mysql error using variable as table name 【发布时间】:2013-03-28 15:07:58 【问题描述】:

为什么会出现这个错误?

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 中使用变量作为表名。在甲骨文你肯定不能。我认为您必须连接,请参阅 JW 的回答 @Sebas:如果我使用 "delete frrom....where" 怎么办,JW 的回答还是可以接受的? 是的,我认为他几乎回答了你所有的问题。 我收到错误:“set @sql_text = concat('Delete from ', tablename, 'WHERE id = pid');” “pid int”--> 包含在参数中..任何帮助? 在WHERE前加一个空格 【参考方案1】:

我想你的意思是,

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

即使在 dynamic sql 中,您也不能参数化表名和列名,因此您唯一的选择是与字符串连接。只有值可以放在占位符中。

mysql PREPARE syntax

更新 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 怎么办?假设我想像这样查询“从 id =idnumber 的表名中删除”? SET @sql = 'Delete from tablename where id = ?' 您可以将idnumber 的值放在占位符中。 我的意思是我仍在使用上面的代码,但这次使用 where 子句。如何连接,包括在哪里? 谢谢!你真是个极客:) 还有一件事,我想在我的参数中包含'id int'并删除我的数据库中的一条记录,对吗? "SET @sql=concat('Delete from', tablename,' where id=pid');

以上是关于mysql错误使用变量作为表名的主要内容,如果未能解决你的问题,请参考以下文章

由于在 MySQL 中使用保留字作为表名或列名导致的语法错误

由于在 MySQL 中使用保留字作为表名或列名导致的语法错误

在mysql中创建表时使用变量作为表名

mysql存储过程 将传入的参数用作为表名 执行时提示错误 Table 'asteriskcdrdb.tbname' doesn't exist

MYSQL 语句中的动态表名 (Google Cloud SQL)

[mysql-connector-python在将表作为参数传递时,在表名周围添加单引号。表名来自Flask会话变量