如何根据包含表名称的字符串从表中选择每一行?

时间:2015-05-06 14:06:34

标签: mysql sql prepared-statement dynamic-sql

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

如果可能的话,我想将这些减少到一个过程,按表名参数化。例如,假设我想执行泛型选择:

SELECT * FROM TableFor("TableName")

MySQL中是否可以(或类似)?是否可以在任何SQL方言中使用?

Per 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');

2 个答案:

答案 0 :(得分:3)

您可以使用prepared statement执行此操作。

这将是

的内容
SET @stat = CONCAT('SELECT * FROM ', @tab'); 

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

动态SQL在函数中不起作用,因此从中创建一个存储过程,您将能够提供表参数。

答案 1 :(得分:0)

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

首先在程序中创建一个表对象

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

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

SET NOCOUNT ON

然后为该表创建一个游标,并为变量保存表名

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

然后遍历游标并为每个表名执行代码

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