3

我正在尝试使用用户定义的变量来代替表名,这样我就可以只使用 mysql 而不需要任何其他语言。

这个例子很简单——真正的脚本使用了很多表名,最终用户能够更容易地更改变量而不是搜索/替换。

SET @tablename = 'mytable';
SELECT * FROM @tablename;

这不起作用,但显示了我需要的最终结果。

4

1 回答 1

5

使用准备好的语句:

SET @tablename = 'mytable';

SET @query = CONCAT('SELECT * FROM ', @mytable);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

如果您的实际查询要复杂得多,您可以将查询的构建包装在一些存储函数中:

DELIMITER //
CREATE FUNCTION GetQuery(tableName VARCHAR(50)) RETURNS VARCHAR(100)
BEGIN
    DECLARE finalQuery VARCHAR(100);
    SET finalQuery = CONCAT('SELECT * FROM ', tableName);
    -- do something fancier with finalQuery here
    RETURN finalQuery;
END //
DELIMITER ;

SET @query = GetQuery('mytable');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

更好的是:在存储过程中做所有事情:

DELIMITER //
CREATE PROCEDURE QueryTable(tableName VARCHAR(50))
BEGIN
    SET @finalQuery = CONCAT('SELECT * FROM ', tableName);
    PREPARE stmt FROM @finalQuery;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    SET @finalQuery = NULL;
END //
DELIMITER ;

CALL QueryTable('mytable');
于 2013-01-27T23:18:00.157 回答