Algunas veces se vuelve necesario buscar algun termino específico en una base de datos, pero no sabemos en que tabla o campo buscar, por tal motivo escribí un STORED PROCEDURE, (Similar al de MSSQL para SAP) para buscar dentro de toda la base de datos y obtener el mejor resultado:
DELIMITER $$
-- PROCEDIMIENTO PRINCIPAL (con 2 parámetros)
DROP PROCEDURE IF EXISTS `search_database_core` $$
CREATE PROCEDURE `search_database_core`(
IN search_term VARCHAR(255),
IN max_per_col INT
)
BEGIN
-- <-- todas las DECLARE primero (obligatorio en MySQL)
-- 2025 TresEmeConsultores.com
-- Maynor Marino Mijangos
DECLARE done INT DEFAULT FALSE;
DECLARE t_schema VARCHAR(64);
DECLARE t_table VARCHAR(64);
DECLARE t_column VARCHAR(64);
DECLARE search_sql TEXT;
DECLARE limit_rows INT;
DECLARE cur CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND DATA_TYPE IN ('char','varchar','text','tinytext','mediumtext','longtext');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- ahora sí las instrucciones ejecutables
SET limit_rows = IFNULL(max_per_col, 5);
DROP TEMPORARY TABLE IF EXISTS search_results;
CREATE TEMPORARY TABLE search_results (
esquema VARCHAR(255),
tabla VARCHAR(255),
columna VARCHAR(255),
valor_encontrado TEXT
);
OPEN cur;
read_loop: LOOP
FETCH cur INTO t_schema, t_table, t_column;
IF done THEN
LEAVE read_loop;
END IF;
-- construir SQL dinámico con proper escaping (backticks) y literal seguro (QUOTE)
SET search_sql = CONCAT(
'INSERT INTO search_results (esquema, tabla, columna, valor_encontrado) ',
'SELECT ', QUOTE(t_schema), ', ', QUOTE(t_table), ', ', QUOTE(t_column), ', `',
REPLACE(t_column,'`','``'), '` ',
'FROM `', REPLACE(t_schema,'`','``'), '`.`', REPLACE(t_table,'`','``'), '` ',
'WHERE `', REPLACE(t_column,'`','``'), '` LIKE ? ',
'LIMIT ', limit_rows
);
SET @s = search_sql;
SET @like = CONCAT('%', search_term, '%');
PREPARE stmt FROM @s;
EXECUTE stmt USING @like;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
-- Resultado consolidado
SELECT * FROM search_results;
END $$
-- WRAPPER para llamar con un solo parámetro (usa 5 por defecto)
DROP PROCEDURE IF EXISTS `search_database` $$
CREATE PROCEDURE `search_database`(
IN search_term VARCHAR(255)
)
BEGIN
CALL search_database_core(search_term, 5);
END $$
DELIMITER ;
Forma de uso:
Directamente en una ventana a través de SQL, teniendo el termino a usar y la cantidad de resultados que deseamos, así:
CALL search_database_core(‘Termino a buscar’, 10);

O ejecutándolo directamente en web a través de phpmyadmin:


