2010-05-04 8 views
0

J'ai besoin d'une procédure stockée pour obtenir les enregistrements d'une table et renvoyer la valeur sous la forme Insertion d'instructions pour les enregistrements sélectionnés .Procédure stockée pour créer des instructions Insert dans MySQL?

Par exemple, la procédure stockée doit avoir trois paramètres d'entrée ...

1- Nom de la table

2- Nom de la colonne

3- Colonne Valeur

Si

1- Nom du tableau = "EMP"

2- Nom de la colonne = « EMPID »

3- colonne Valeur = « 15 »

Ensuite, la sortie doit être, sélectionner toutes les valeurs de EMP où EMPID est 15 Une fois que les valeurs sont sélectionnées pour condition ci-dessus, le stocké procédure doit retourner le script pour l'insertion des valeurs sélectionnées.

L'objectif est de sauvegarder les valeurs sélectionnées. Lorsque le SP renvoie une valeur {Insert statements}, C# va simplement les écrire dans un fichier .sql.

Je n'ai aucune idée de l'écriture de ce SP, tous les échantillons de code sont appréciés. Merci ..

Répondre

0
DELIMITER $$ 

DROP PROCEDURE IF EXISTS `sample`.`InsGen` $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `InsGen`(
in_db varchar(20), 
in_table varchar(20), 
in_ColumnName varchar(20), 
in_ColumnValue varchar(20) 
) 
BEGIN 

declare Whrs varchar(500); 
declare Sels varchar(500); 
declare Inserts varchar(200); 
declare tablename varchar(20); 
declare ColName varchar(20); 


set tablename=in_table; 


# Comma separated column names - used for Select 
select group_concat(concat('concat(\'"\',','ifnull(',column_name,','''')',',\'"\')')) 
INTO @Sels from information_schema.columns where table_schema=in_db and table_name=tablename; 


# Comma separated column names - used for Group By 
select group_concat('`',column_name,'`') 
INTO @Whrs from information_schema.columns where table_schema=in_db and table_name=tablename; 


#Main Select Statement for fetching comma separated table values 

set @Inserts=concat("select concat('insert IGNORE into ", in_db,".",tablename," values(',concat_ws(',',",@Sels,"),');') 
as MyColumn from ", in_db,".",tablename, " where ", in_ColumnName, " = " , in_ColumnValue, " group by ",@Whrs, ";"); 

PREPARE Inserts FROM @Inserts; 

EXECUTE Inserts;      

END $$ 

DELIMITER ; 
4

Vous pouvez le faire avec mysqldump:

mysqldump --no-create-info --skip-triggers 
    --where="$COLUMN_NAME='$COLUMN_VALUE'" --databases $DB --tables $TABLE_NAME 
0

dû faire face à cette question aujourd'hui.

mysqldump est bien mais pas trop amical pour changer la clause WHERE.

Je finis par SQLyog, un client MySQL, il dispose d'une fonctionnalité permettant d'exporter un ensemble de résultats de n'importe quelle instruction SELECT SQL dans un tas d'instructions INSERT.

2

Pour développer la réponse de Anuya (qui est référencé à partir http://kedar.nitty-witty.com/blog/mysql-stored-procedure-to-generate-extract-insert-statement) btw ...

d'abord besoin de quelques fonctions mysql assistant:

/* 
isNumeric - return 1/true if passed in string is numeric, false otherwise 
Usage example: select isNumeric('2012-02-16'); => 0 
*/ 
DROP FUNCTION IF EXISTS `bettermentdb`.`isNumeric`; 
DELIMITER ;; 
CREATE DEFINER=`betterment-web`@`localhost` FUNCTION `bettermentdb`.`isNumeric`(s varchar(255)) 
RETURNS TINYINT 
DETERMINISTIC 
BEGIN 
    SET @match ='^(([0-9+-.$]{1})|([+-]?[$]?[0-9]*(([.]{1}[0-9]*)|([.]?[0-9]+))))$'; 
    RETURN IF(s regexp @match, 1, 0); 
END;; 
DELIMITER ; 

/* 
isNumeric - return an input wrapped in "'" if value is non-numeric, original otherwise. 
Depends on isNumeric() 
Usage example: select wrapNonNumeric(now()); => '2012-02-16' 
      select wrapNonNumeric(NULL); => NULL 
      select wrapNonNumeric(1); => 1 
*/ 
DROP FUNCTION IF EXISTS `bettermentdb`.`wrapNonNumeric`; 
DELIMITER ;; 
CREATE DEFINER=`betterment-web`@`localhost` FUNCTION `bettermentdb`.`wrapNonNumeric`(s varchar(255)) 
RETURNS varchar(255) 
DETERMINISTIC 
BEGIN 
    RETURN IF(isNumeric(s), s, concat("'", s, "'")); 
END;; 
DELIMITER ; 

Sorties à la console avec les noms de col définit et les valeurs non numériques enveloppé entre guillemets, tout en restreignant sur une ligne donnée d'entrée db.table:

DELIMITER ;; 
DROP PROCEDURE IF EXISTS GenerateInsertSQL; 
CREATE DEFINER=`root`@`localhost` PROCEDURE GenerateInsertSQL(IN in_db varchar(20), IN in_table varchar(32), IN in_row BIGINT) 
READS SQL DATA 
BEGIN 
    DECLARE nullableValues varchar(1000); 
    DECLARE colNames varchar(1000); 
    DECLARE insertStmnt varchar(2000); 

    SELECT group_concat(concat('IFNULL(wrapNonNumeric(`',column_name,'`), "NULL")')) INTO @nullableValues from information_schema.columns where table_schema=in_db and table_name=in_table; 
    SELECT group_concat(concat('`',column_name,'`')) INTO @colNames from information_schema.columns where table_schema=in_db and table_name=in_table; 

    SET @insertStmnt=concat("select concat('INSERT INTO `", in_db, "`.`", in_table, "`(", @colNames, ") VALUES (', concat_ws(', ',",@nullableValues,"),');') from ", in_db, ".", in_table, " where id = ", in_row, " group by ", @colNames, ";"); 
    PREPARE insertStmnt FROM @insertStmnt; 
    EXECUTE insertStmnt; 
END 
DELIMITER ; 
+0

SET @@ session.group_concat_max_len = 102400; pour les tables qui ont trop de colonnes –

Questions connexes