2010-05-04 94 views
0

我需要存儲過程才能獲取表格的記錄,並將所選記錄的值作爲插入語句返回。在MySql中創建插入語句的存儲過程?

例如,存儲的過程應該有三個輸入參數...

1-表名稱

2-列名

3-列值

如果

1-表名=「EMP」

2-列名稱=「EMPID」

3-列值=「15」

然後輸出應該是,選擇EMP的所有值,其中EMPID是15 一旦值被選擇爲上述條件下,所存儲的過程必須 返回插入選定值的腳本。

這樣做的目的是對所選值進行備份。當SP返回 值{插入語句}時,C#會將它們寫入一個.sql文件。

我不知道如何編寫這個SP,任何代碼示例都是可以理解的。 謝謝..

回答

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

您可以使用mysqldump做到這一點:

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

今天不得不處理這個問題。

mysqldump是好的,但不太友好,以改變WHERE子句。

我結束了SQLyog,一個MySQL客戶端,它有一個功能,您可以將任何sql SELECT語句的結果集導出到一堆INSERT語句中。

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 ; 
+0

SET @@ session.group_concat_max_len = 102400;用於列數太多的表格 – 2016-01-22 08:29:13

相關問題