如何根据包含 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
在 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