【问题标题】:MySQL select from dynamic database and table queryMySQL 从动态数据库和表查询中选择
【发布时间】:2015-08-07 13:41:09
【问题描述】:

存储过程定义:

DECLARE dbName varchar(255);
DECLARE tableName varchar(255);
DECLARE fullPath varchar(255);
DECLARE conditions varchar(255);

SET dbName = idbname;
SET tableName = itablename;
SET fullPath = CONCAT("'",dbName,"'",'.',"'",tableName,"'");
SET checkExists = 0;

我正在创建一个存储过程,其中 dbname 和 tablename 是动态的,但是我被困在这个查询的选择方面。

我正在尝试用传递到存储过程中的值来替换 _test.user

SELECT count(*) INTO checkExists FROM `_test`.`user` WHERE id = 1;

但是这行会报错

SELECT count(*) INTO checkExists FROM fullPath WHERE id = 1;

错误:

Procedure execution failed
1146 - Table 'dbname.fullpath' doesn't exist

我也试过这样的 CONCAT()

set conditions = CONCAT('SELECT count(*) INTO ',checkExists, ' FROM ', fullPath, ' WHERE id=', 1);

但是我什至不知道如何在选择中使用它?感谢您的帮助。

【问题讨论】:

  • 看看这是否有帮助:dev.mysql.com/doc/refman/5.1/en/…
  • 是的,准备好的语句可以与我的 concat 语句一起使用。我试图找出为什么我不能通过传入一个变量来正常进行选择。或者如果可能的话

标签: mysql database stored-procedures


【解决方案1】:

我喜欢使用replace() 进行这些修改。像这样的:

replace(replace('SELECT count(*) INTO checkExists FROM `<dbname>`.`<tname>` WHERE id = 1',
                '<tname>', v_tablename
               ), '<dbname>', v_databasename
       )

您可能还想在某处使用v_fullpath。我不太确定您真正想要创建什么查询。

我不确定为什么你有一个名为checkExists 的变量,而它似乎是目标文件。但是,我建议您在所有局部变量前面加上一些东西以将它们与列名区分开来。

【讨论】:

  • 我正在比较两个表中的行,如果表 2 中存在不在表 1 中的行,我将执行两个单独的数据库上存在的删除。另外,我不明白在这种情况下如何使用替换?
  • @Harry 。 . .你应该问另一个问题,并对你正在做的事情进行有效的描述。这个问题显然是关于一张桌子和一堆变量的。在有答案后修改问题是不礼貌的,因为它会使答案无效。
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多