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 に答える