在将Excel导入到SQL表时,系统默认将excel中的数值列转换成float类型的字段列,因为后面的操作有可能会遇到将转换后的SQL表中的字段列转换成char型数据,问题产生了,float型的数值转换成char或者varchar型的数据时会自动采用科学技术法进行四舍五入,比如原来的数值为123456789,转换成char后就成为了123457000,请问此问题应该怎么解决????不好意思,上面说了那么多,可能不好理解,总体来说,就是有没有办法在将excel文件导入到SQL中时,指定字段类型?
或者有没有什么类型可能又能包含字符,又能包含数值,而且在float型转换成该类型时不会发生任何改变?

解决方案 »

  1.   

    从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:  
     
    /*===================================================================*/  
    --如果接受数据导入的表已经存在  
    insert  into  表  select  *  from    
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'  
    ,'Excel  5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)  
     
    --如果导入数据并生成表  
    select  *  into  表  from    
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'  
    ,'Excel  5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)  
     
     
    /*===================================================================*/  
    --如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用:  
    insert  into  OPENROWSET('MICROSOFT.JET.OLEDB.4.0'  
    ,'Excel  5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)  
    select  *  from  表  
     
     
    --如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写:  
    --导出表的情况  
    EXEC  master..xp_cmdshell  'bcp  数据库名.dbo.表名  out  "c:\test.xls"  /c  -/S"服务器名"  /U"用户名"  -P"密码"'  
     
    --导出查询的情况  
    EXEC  master..xp_cmdshell  'bcp  "SELECT  au_fname,  au_lname  FROM  pubs..authors  ORDER  BY  au_lname"  queryout  "c:\test.xls"  /c  -/S"服务器名"  /U"用户名"  -P"密码"'  
     
    ---------------------------------------------------------------  
     
    /*  
    存储过程名称:导出数据到Excel  
    功能描述:导出数据到Excel  
     
    EXEC  ExportToExcel  @server  =  '.',  
                                         @uname  =  'sa',  
                                         @pwd  =  '',  
                                         @QueryText  =  'SELECT  *  FROM  dldata..bbbbbb',  
                                         @filename  =  'd:\ImportToExcel.xls'  
    */  
     
    IF  OBJECT_ID('ExportToExcel')  IS  NOT  NULL  DROP  PROC  ExportToExcel  
    GO  
     
    CREATE  PROCEDURE  ExportToExcel  (  
       @server  sysname  =  null,  
       @uname  sysname  =  null,  
       @pwd  sysname  =  null,  
       @QueryText  varchar(200)  =  null,  
       @filename  varchar(200)  =  'd:\ImportToExcel.xls'  
    )  
    AS  
    DECLARE  @SQLServer  int,  --SQLDMO.SQLServer对象  
                   @QueryResults  int,  --QueryResults对象  
                   @CurrentResultSet  int,  
                   @object  int,  --Excel.Application对象  
                   @WorkBooks  int,  
                   @WorkBook  int,  
                   @Range  int,  
                   @hr  int,  
                   @Columns  int,  
                   @Rows  int,  
                   @indColumn  int,  
                   @indRow  int,  
                   @off_Column  int,  
                   @off_Row  int,  
                   @code_str  varchar(100),  
                   @result_str  varchar(255)  
     
    IF  @QueryText  IS  NULL    
    BEGIN  
         PRINT  'Set  the  query  string'  
         RETURN  
    END  
     
    --设置服务器名为本地服务器(@@servername返回运行SQL  Server的本地服务器名称)  
    IF  @server  IS  NULL  SELECT  @server  =  @@servername  
     
    --设置用户名为当前系统用户名(使用SYSTEM_USER返回当前系统用户名)  
    IF  @uname  IS  NULL  SELECT  @uname  =  SYSTEM_USER  
     
    SET  NOCOUNT  ON  
     
    --创建SQLDMO.SQLServer对象  
    EXEC  @hr  =  sp_OACreate  'SQLDMO.SQLServer',  @SQLServer  OUT  
    IF  @hr  <>  0  
    BEGIN  
         PRINT  'error  create  SQLDMO.SQLServer'  
         RETURN  
    END  
     
    --连接到SQL  Server系统  
    IF  @pwd  IS  NULL  
    BEGIN  
         EXEC  @hr  =  sp_OAMethod  @SQLServer,  'Connect',  null,  @server,  @uname  
         IF  @hr  <>  0  
         BEGIN  
               PRINT  'error  Connect'  
               RETURN  
         END  
    END  
    ELSE  
    BEGIN  
         EXEC  @hr  =  sp_OAMethod  @SQLServer,  'Connect',  null,  @server,  @uname,  @pwd  
         IF  @hr  <>  0  
         BEGIN  
               PRINT  'error  Connect'  
               RETURN  
         END  
    END  
     
    --The  ExecuteWithResults  method  executes  a  Transact-SQL  command  batch    
    --returning  batch  result  sets  in  a  QueryResults  object  
    SELECT  @result_str  =  'ExecuteWithResults("'  +  @QueryText  +  '")'  
    EXEC  @hr  =  sp_OAMethod  @SQLServer,  @result_str,  @QueryResults  OUT  
    IF  @hr  <>  0  
    BEGIN  
           PRINT  'error  with  method  ExecuteWithResults'  
           RETURN  
    END  
     
    --The  CurrentResultSet  property  controls  access  to  the  result  sets  of  a  QueryResults  object  
    EXEC  @hr  =  sp_OAMethod  @QueryResults,  'CurrentResultSet',  @CurrentResultSet  OUT  
    IF  @hr  <>  0  
    BEGIN  
         PRINT  'error  get  CurrentResultSet'  
         RETURN  
    END  
      

  2.   

    --The  Columns  property  exposes  the  number  of  columns  contained    
    --in  the  current  result  set  of  a  QueryResults  object  
    EXEC  @hr  =  sp_OAMethod  @QueryResults,  'Columns',  @Columns  OUT  
    IF  @hr  <>  0  
    BEGIN  
         PRINT  'error  get  Columns'  
         RETURN  
    END  
     
    --The  Rows  property  returns  the  number  of  rows  in  a  referenced  
    --query  result  set  or  the  number  of  rows  existing  in  a  table  
    EXEC  @hr  =  sp_OAMethod  @QueryResults,  'Rows',  @Rows  OUT  
    IF  @hr  <>  0  
    BEGIN  
         PRINT  'error  get  Rows'  
         RETURN  
    END  
     
    --创建Excel.Application对象  
    EXEC  @hr  =  sp_OACreate  'Excel.Application',  @object  OUT  
    IF  @hr  <>  0  
    BEGIN  
         PRINT  'error  create  Excel.Application'  
         RETURN  
    END  
     
    --获得Excel工作簿对象  
    EXEC  @hr  =  sp_OAGetProperty  @object,  'WorkBooks',  @WorkBooks  OUT  
    IF  @hr  <>  0  
    BEGIN  
         PRINT  'error  create  WorkBooks'  
         RETURN  
    END  
     
    --在工作簿对象中加入一工作表  
    EXEC  @hr  =  sp_OAGetProperty  @WorkBooks,  'Add',  @WorkBook  OUT  
    IF  @hr  <>  0  
    BEGIN  
         PRINT  'error  with  method  Add'  
         RETURN  
    END  
     
    --Range对象(A1单元格)  
    EXEC  @hr  =  sp_OAGetProperty  @object,  'Range("A1")',  @Range  OUT  
    IF  @hr  <>  0  
    BEGIN  
         PRINT  'error  create  Range'  
         RETURN  
    END  
     
    SELECT  @indRow  =  1  
    SELECT  @off_Row  =  0  
    SELECT  @off_Column  =  1  
     
    WHILE  (@indRow  <=  @Rows)  
    BEGIN  
         SELECT  @indColumn  =  1  
         WHILE  (@indColumn  <=  @Columns)  
         BEGIN  
               --The  GetColumnString  method  returns  a  QueryResults  object  result  set  member  converted  to  a  String  value  
               EXEC  @hr  =  sp_OAMethod  @QueryResults,  'GetColumnString',  @result_str  OUT,  @indRow,  @indColumn  
               IF  @hr  <>  0  
               BEGIN  
                     PRINT  'error  get  GetColumnString'  
                     RETURN  
               END  
     
               EXEC  @hr  =  sp_OASetProperty  @Range,  'value',  @result_str  
               IF  @hr  <>  0  
               BEGIN  
                     PRINT  'error  set  value'  
                     RETURN  
               END  
     
               EXEC  @hr  =  sp_OAGetProperty  @Range,  'Offset',  @Range  OUT,  @off_Row,  @off_Column  
               IF  @hr  <>  0  
               BEGIN  
                     PRINT  'error  get  Offset'  
     
                     RETURN  
               END  
     
               SELECT  @indColumn  =  @indColumn  +  1  
     
         END  
     
         SELECT  @indRow  =  @indRow  +  1  
         SELECT  @code_str  =  'Range("A'  +  LTRIM(str(@indRow))  +  '")'  
         EXEC  @hr  =  sp_OAGetProperty  @object,  @code_str,  @Range  OUT  
         IF  @hr  <>  0  
         BEGIN  
               PRINT  'error  create  Range'  
               RETURN  
         END  
     
    END  
     
    SELECT  @result_str  =  'exec  master..xp_cmdshell  ''del  '  +  @filename  +  ''',  no_output'  
    EXEC(@result_str)  --如果存在@filename文件,则先删除  
    SELECT  @result_str  =  'SaveAs("'  +  @filename  +  '")'  
    EXEC  @hr  =  sp_OAMethod  @WorkBook,  @result_str  
    IF  @hr  <>  0  
    BEGIN  
           PRINT  'error  with  method  SaveAs'  
           RETURN  
    END  
     
    EXEC  @hr  =  sp_OAMethod  @WorkBook,  'Close'  
    IF  @hr  <>  0  
    BEGIN  
           PRINT  'error  with  method  Close'  
           RETURN  
    END  
     
    EXEC  @hr  =  sp_OADestroy  @object  
    IF  @hr  <>  0  
    BEGIN  
           PRINT  'error  destroy  Excel.Application'  
           RETURN  
    END  
     
    EXEC  @hr  =  sp_OADestroy  @SQLServer  
    IF  @hr  <>  0  
    BEGIN  
           PRINT  'error  destroy  SQLDMO.SQLServer'  
           RETURN  
    END  
    GO  
      

  3.   

    晕看得头都大了。。楼上的仁兄似乎没有理解到我的问题。导入导出来的功能我都已经完成了
    问题是在于将excel导入到SQL时,系统默认将Excel中的数值列转换成float中的字段列,但是后面的操作会将字段列转换成char型或者varchar型,问题就在于此,float型的数据转换成char或者varchar时会产生四舍五入的科学计数法。这个问题怎么解决