需求说明.  mysql数据库中创建数据库和表
 
  CREATE DATABASE xx;  USE xx
 
  CREATE TABLE x1 (
     id VARCHAR(20) NOT NULL DEFAULT ''
  );   PC机上 C:/up01.sql                        
   
  up01.sql文件里面的内容是: ALTER TABLE x1 CHANGE id idd VARCHAR(60);  现在我想用一个存储过程来完成这个操作.
  
  
  USE xx  DELIMITER $$
  CREATE PROCEDURE xxx()
  BEGIN
  -- 在这个地方,我将用什么方法能够把本机上C:/up01.sql文件导入到对应的数据库中.                
  END $$
  DELIMITER ;求各位大哥明示~~~~~
  
 

解决方案 »

  1.   

    用一个临时表,字段BH,用LOAD DATA INFILE导入此SQL文件,
    再动态执行,
    为什么一定要用SP,直接
    D:\mysql6\bin\mysql -uroot -p123 test<c:\1.sql不行
      

  2.   


    针对这个问题,我继续增加点需求说明。其实我也不想用SP的。但最重要的是. 其实不止一个 up01.sql文件。还有up02.sql up03.sql......这些都是在不同的IF中去执行的。例如IF i>1 THEN
    -- 执行up01.sql
    END IF;IF i<1 THEN
    -- 执行up02.sql
    END IF;=====================================如果我不用SP我将不法判断是否执行哪一个*.sql文件所以我选择SP。。
      

  3.   

    IF i>1 THEN
    LOAD DATA INFILE '/tmp/up01.sql' INTO TABLE test;
    select sql into @sql from test;
    prepare dd from @sql;
    execute dd;
    END IF;
      

  4.   

      DELIMITER $$
      CREATE PROCEDURE xxx()
      BEGIN   
      LOAD DATA INFILE '/tmp/up01.sql' INTO TABLE test;
      select sql into @sql from test;
      prepare dd from @sql;
      execute dd;                
      END $$
      DELIMITER ;LOAD DATA is not allowed in stored procedures
    貌似一样的用不鸟
      

  5.   

    测试了一下,确实是这样,只有预处理一下,将所有。SQL的内容导入表中,加入标识符,再动态
    执行
      

  6.   


     这个貌似不行,表数据大多都是1000W行的。。全部倒入用标识符去选择。。性能上会死人的 那请问。不用SP或别的什么高招,能解决这个问题吗?
      

  7.   

    没有办法,在存储过程中去执行一下磁盘文件中的SQL脚本。
    除非你的这个SQL脚本用LOAD DATA把这个文件加载到表中,然后再从表中生成SQL语句通过PREPARE,EXECUTE来执行。
    你最终想实现的功能是什么?完成同一个功能,可能的方法有多种。
      

  8.   

     其实,我是要做一个数据库的升级程序.
     例如我有一个旧表
     
      
      CREATE TABLE x1 (
         id VARCHAR(20) NOT NULL DEFAULT ''
      ); 但是,我现在觉得这个表的字段不够用或者字段名需要改一下. 我就需要将其升级 ALTER TABLE x1 ADD name VARCHAR(10) NOT NULL DEFAULT ''; 
     -- 或者
     ALTER TABLE x1 CHANGE id idd VARCHAR(60);但是,现在我是要通过一个选择判断来执行,是否是加一个字段,还是改一下字段名。所以就要通过 IF 去判断 我就想完成一个这样的功能。。我本来就直接把这些执行语句,直接写到SP里面。不调用*.sql文件的。但是这些 ALTER TABLE xx1 ADD的语句不止一条,也不止一个表要改,有很多。维护很困难。不可取而且还根据不同的版本号去执行不同的修改。请问。ACMAIN_CHM 大哥,有什么好的方法吗?
     
      
      

  9.   

     希望我的表述 ACMAIN_CHM 大哥能看的懂。。- -!
      

  10.   

    版本号
    =========================================================================
    CREATE TABLE versionnum (
           id INT NOT NULL auto_increment,
           ver_num VARCHAR(20) NOT NULL,
           PRIMARY KEY(id)       
    );
    INSERT INTO versionnum(id,ver_num)VALUES(0,'1.0.0.1'); 
    这是旧数据库里面已经有版本号~现在有个最新的版本 ver_num 1.0.0.3我需要判断这个字段是否是1.0.0.3。-- 如果这个ver_num 等于1.0.0.3就不需要升级. 
    -- 如果这个ver_num 等于1.0.0.1就需要改一些字段
    -- 如果这个vev_num 等于1.0.0.2就需要修改另一些字段了。
    SELECT ver_num FROM versionnum where id=1 ; 
      

  11.   

    这个可以直接通过你的操作系统脚本来实现啊。你的操作系统是什么WIN7 ? LINUX CShell?
      

  12.   

           windows xp...- -!
      

  13.   

    当然可以用存储过程完成。只不过比较复杂。LOAD DATA INFILE '/tmp/up01.sql' INTO TABLE test;然后再 select @sql:=concat(@sql,col1) from test order by id;之后再PREPARE / EXECUTE
      

  14.   

      请 ACMAIN_CHM 大哥,用存储过程给个思路。。
     
      

  15.   

    if xx = '1.1.1.1' then
      delete from  test;
      LOAD DATA INFILE '/tmp/v1111.sql' INTO TABLE test(col1);
      set @sql='';
       select @sql:=concat(@sql,col1) from test order by id;
       prepare stmt from @sql;
      execute stmt;
      DEALLOCATE PREPARE  stmt;
    ...
      

  16.   

    啊。。ACMAIN_CHM 大哥!!! 其实我在4楼的时候,验证了LOAD DATA INFILE 也不能在SP里面使用啊会报 :LOAD DATA is not allowed in stored procedures 错误的哦。