DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `duplicates`(IN `db` VARCHAR(64) CHARSET utf8, IN `tbl` VARCHAR(64) CHARSET utf8, IN `dir` VARCHAR(256) CHARSET utf8) BEGIN SET @grplst = 0; SET @replst = 0; /*get list of columns for grouping*/ SELECT GROUP_CONCAT(COLUMN_NAME) INTO @grplst FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=db AND TABLE_NAME=tbl; /*get list of columns for reporting*/ SELECT GROUP_CONCAT(COLUMN_NAME,' ',COLUMN_TYPE,' NULL') INTO @replst FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=db AND TABLE_NAME=tbl; /* create reporting table*/ EXECUTE IMMEDIATE CONCAT ('CREATE DATABASE IF NOT EXISTS ',db,'_profile'); EXECUTE IMMEDIATE CONCAT ('DROP TABLE IF EXISTS ',db,'_profile.',tbl,'_duplicates'); EXECUTE IMMEDIATE CONCAT( 'CREATE TABLE ',db,'_profile.',tbl,'_duplicates ( $Id BIGINT NOT NULL AUTO_INCREMENT, $Duplicates BIGINT NULL, ',@replst,', PRIMARY KEY ($Id) ) ENGINE = InnoDB'); EXECUTE IMMEDIATE CONCAT( 'INSERT INTO ',db,'_profile.',tbl,'_duplicates ($Duplicates,',@grplst,') SELECT COUNT(*),',@grplst,' FROM ',db,'.',tbl,' GROUP BY ',@grplst,' HAVING COUNT(*)>1' ); /*export reporting file*/ SET @file = CONCAT(REPLACE(dir,'\\','\\\\'),CONCAT(tbl,'_duplicates_',REPLACE(NOW(),':',''),'.csv')); EXECUTE IMMEDIATE CONCAT('SELECT * INTO OUTFILE \'',@file,'\' FIELDS TERMINATED BY \';\' OPTIONALLY ENCLOSED BY \'\"\' LINES TERMINATED BY \'\\n\' FROM ',db,'_profile.',tbl,'_duplicates'); END$$ DELIMITER ;