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:


Shares: