MÉTODO 1: Tabla Temporal
Las respuestas ya publicados sobre el uso de una tabla temporal suele ser la solución más adecuada. Pero hay un punto importante que si la consulta se ejecuta tal como está, todas las uniones, etc. se procesarán, lo que podría llevar mucho tiempo en algunos casos. Afortunadamente, MySQL permite que LIMIT 0
no devuelva filas y el documentation indica que esto "devuelve rápidamente un conjunto vacío". El siguiente procedimiento almacenado va a hacer este trabajo para usted mediante la adopción de una cadena de consulta SQL como entrada, envolviéndolo con LIMIT 0
, ejecutar la consulta dinámica para producir una tabla temporal y luego mostrando sus columnas:
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 punto importante es la consulta pasada no debe tener un punto y coma al final. (Si es necesario, el procedimiento almacenado podría ser modificado para eliminar el arrastre de punto y coma, pero yo quería que sea sencillo.)
Aquí está una demostración en vivo que muestra en acción: http://rextester.com/NVWY58430
MÉTODO 2: INFORMATION_SCHEMA.COLUMNAS
La misma información devuelta por SHOW COLUMNS
también se puede obtener directamente de la tabla 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
Los sufre por encima de las desventajas de requerir la tabla (y la columna opcionalmente) Nombres a ser introducidos manualmente y no muestra los nombres de los alias en el SELECT
pero hace el trabajo básico. Sus ventajas son que no requiere que el usuario tenga permiso para crear una tabla temporal y la información devuelta se puede ampliar para proporcionar más información de columna, como longitud máxima de caracteres, precisión/escala numérica, comentarios de columnas, etc.
¿Simplemente desea recuperar las columnas asociadas con una tabla y su información correspondiente? –
SÍ, pero desde Dynamic Query, no desde TABLE –
Hay API para buscar metadatos sobre un conjunto de resultados. ¿Qué entorno de lenguaje de programación usas? Debería haber soluciones para la mayoría de los idiomas, pero para dar un ejemplo necesitaría saber cuál usa. –