在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');
答案 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