【问题标题】:Stored Procedure to create Insert statements in MySql?在 MySql 中创建插入语句的存储过程?
【发布时间】:2010-05-04 08:06:24
【问题描述】:

我需要一个存储过程来获取表的记录并将值作为插入语句返回 选定的记录。

例如,存储过程应该有三个输入参数...

1- 表名

2- 列名

3- 列值

如果

1- 表名 = "EMP"

2- 列名 = "EMPID"

3- 列值 = "15"

那么输出应该是,选择 EMP 的所有值,其中 EMPID 为 15 一旦为上述条件选择了值,存储过程必须 返回插入所选值的脚本。

这样做的目的是备份选定的值。当 SP 返回时 一个值 {Insert statements},c# 只会将它们写入 .sql 文件。

我不知道要编写这个 SP,任何代码示例都可以使用。 谢谢..

【问题讨论】:

    标签: mysql mysqldump


    【解决方案1】:

    你可以用 mysqldump 做到这一点:

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

    【讨论】:

      【解决方案2】:

      为了扩展 Anuya 的答案(引用自 http://kedar.nitty-witty.com/blog/mysql-stored-procedure-to-generate-extract-insert-statement)顺便说一句...

      首先需要一些mysql的辅助函数:

      /*
      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 ;
      

      输出到控制台的列名称定义和非数字值用引号括起来,同时限制输入 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 ;
      

      【讨论】:

      • SET @@session.group_concat_max_len = 102400;对于列太多的表
      【解决方案3】:
      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】:

        今天不得不处理这个问题。

        mysqldump 还可以,但是不太友好,修改 WHERE 子句。

        我最终选择了SQLyog,一个 MySQL 客户端,它有一个功能,您可以将任何 sql SELECT 语句的结果集导出到一堆 INSERT 语句中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-20
          • 2019-02-24
          • 2012-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多