MÉTHODE 1: table temporaire
Les réponses déjà affichées sur l'utilisation d'une table temporaire sera généralement la solution la plus appropriée. Mais il est important de noter que si la requête est exécutée telle quelle, toutes les jointures etc. seront traitées, ce qui peut prendre du temps dans certains cas. Heureusement, MySQL permet LIMIT 0
de ne renvoyer aucune ligne et le documentation indique que cela "renvoie rapidement un ensemble vide". La procédure stockée suivante fera ce travail pour vous en prenant une chaîne de requête SQL en entrée, l'enveloppant avec LIMIT 0
, exécution de la requête dynamique pour produire une table temporaire, puis montrant ses colonnes:
CREATE PROCEDURE showColumns(IN sqlToShow TEXT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS tempTable;
SET @sqlLimit0 = CONCAT('CREATE TEMPORARY TABLE tempTable AS (SELECT * FROM (',
sqlToShow, ') subq LIMIT 0)');
PREPARE stmt FROM @sqlLimit0;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SHOW COLUMNS FROM tempTable;
END;
Un point important est la requête transmise ne devrait pas avoir de point-virgule à la fin. (Si nécessaire, la procédure stockée pourrait être modifiée pour enlever arrière des points-virgules, mais je voulais garder les choses simples.)
Voici une démonstration en direct montrant en action: http://rextester.com/NVWY58430
MÉTHODE 2: INFORMATION_SCHEMA.COLONNES
Les mêmes informations renvoyées par SHOW COLUMNS
peuvent également être obtenus directement à partir de la table INFORMATION_SCHEMA.COLUMNS
:
SELECT TABLE_NAME AS `Table`,
COLUMN_NAME AS `Field`,
COLUMN_TYPE AS `Type`,
IS_NULLABLE AS `Null`,
COLUMN_KEY AS `Key`,
COLUMN_DEFAULT AS `Default`,
EXTRA AS `Extra`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = SCHEMA() -- This uses the current schema
AND `TABLE_NAME` IN ('table1', 'table2', 'etc.');
-- ...or could go even further and restrict to particular columns in tables if desired
Les ci-dessus présente les inconvénients de nécessiter la table des noms (et la colonne éventuellement) pour être saisies manuellement et ne montre pas les noms d'alias dans le SELECT
mais il fait le travail de base. Ses avantages sont qu'il ne nécessite pas l'autorisation de créer une table temporaire et que les informations renvoyées peuvent être étendues pour fournir d'autres informations sur les colonnes telles que la longueur maximale des caractères, la précision/échelle numérique, les commentaires de colonne, etc ...
Voulez-vous simplement récupérer les colonnes associées à une table et leurs informations correspondantes? –
OUI mais à partir de la requête dynamique, pas à partir du TABLEAU –
Il existe des API permettant d'extraire des métadonnées à propos d'un ensemble de résultats. Quel environnement de langage de programmation utilisez-vous? Il devrait y avoir des solutions pour la plupart des langues, mais pour donner un exemple, je devrais savoir lequel vous utilisez. –