如何根据包含 table 名称的字符串 table 中的每一行 select?

How do I select every row from a table based on a string containing the name of the table?

在 MySQL 中,我有许多或多或少相同的过程 - 它们都执行相同(或非常相似)的操作,但它们在不同的 table 上执行。

我想将这些缩减为一个过程,如果可能的话,由 table 名称参数化。例如,假设我想执行一个通用的 select:

SELECT * FROM TableFor("TableName")

这(或类似的)在 MySQL 中可能吗?任何 SQL 方言都可以吗?

根据 Tomva 的回答

完整示例:

DROP PROCEDURE IF EXISTS example;

CREATE PROCEDURE example(IN tablename VARCHAR(1000)) BEGIN
  SET @statement = CONCAT('SELECT * FROM ', @tablename);

  PREPARE statement FROM @statement;
  EXECUTE statement;
  DEALLOCATE PREPARE statement;
END;

CALL example('tablename');

您可以使用 prepared statement 来做到这一点。

这将与

类似
SET @stat = CONCAT('SELECT * FROM ', @tab'); 

PREPARE stat1 FROM @stat; 
EXECUTE stat1; 
DEALLOCATE PREPARE stat1; 

动态SQL在函数中不起作用,所以从这里创建一个存储过程,你将能够提供table参数。

我假设您知道什么是存储过程(我希望您知道,否则我的回答将毫无用处)

首先在您的过程中创建一个 table 对象

declare @tablenames table(name varchar)
insert into @MonthsSale (name) values ('firsttable')
insert into @MonthsSale (name) values ('secondtable')
...

您可以添加这一行来抑制受影响消息的行:

SET NOCOUNT ON

然后为这个 table 创建一个游标和一个变量来保存你的 table 名字

DECLARE @TABLENAME VARCHAR
DECLARE tables_cursor CURSOR FOR SELECT name FROM @tablenames

然后遍历游标并为每个 table 名称执行您的代码

OPEN Tables_cursor
FETCH NEXT FROM Tables_cursor INTO @Tablename

WHILE @@FETCH_STATUS = 0
BEGIN
  YOUR CODE USING THE @Tablename
END
CLOSE Tables_cursor
DEALLOCATE Tables_cursor