【问题标题】:mysql error using variable as table namemysql错误使用变量作为表名
【发布时间】: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前加一个空格

标签: mysql sql select


【解决方案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 中,您也不能参数化表名和列名,因此您唯一的选择是与字符串连接。只有值可以放在占位符中。


更新 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');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2019-04-29
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多