您的位置:程序门 -> vb -> 数据库(包含打印,安装,报表)



如何将sqlsevr中表导入到excel中


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


如何将sqlsevr中表导入到excel中[已结贴,结贴人:linjing0571]
发表于:2007-06-16 18:07:50 楼主
如题,如何将sqlsevr中的表格内容导入到excel表中?语言使用的是vb
发表于:2007-06-17 00:20:581楼 得分:0
有很多办法,比较高效的是使用sql   的bcp工具,详细的查找一下资料.
发表于:2007-06-17 08:00:462楼 得分:20
'转贴
'original   author:   邹建

--从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 "密码 " '

/*--说明:
c:\test.xls     为导入/导出的excel文件名.
sheet1$             为excel文件的工作表名,一般要加上$才能正常使用.
--*/
 

--下面是导出真正excel文件的方法:

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(n '[dbo].[p_exporttb] ')   and   objectproperty(id,   n 'isprocedure ')   =   1)
drop   procedure   [dbo].[p_exporttb]
go

/*--数据导出excel
 
  导出表中的数据到excel,包含字段名,文件为真正的excel文件
  ,如果文件不存在,将自动创建文件
  ,如果表不存在,将自动创建表
  基于通用性考虑,仅支持导出标准数据类型

--邹建   2003.10(引用请保留此信息)--*/

/*--调用示例

  p_exporttb   @tbname= '地区资料 ',@path= 'c:\ ',@fname= 'aa.xls '
--*/
create   proc   p_exporttb
@tbname   sysname,         --要导出的表名
@path   nvarchar(1000),       --文件存放目录
@fname   nvarchar(250)= ' '     --文件名,默认为表名
as
declare   @err   int,@src   nvarchar(255),@desc   nvarchar(255),@out   int
declare   @obj   int,@constr   nvarchar(1000),@sql   varchar(8000),@fdlist   varchar(8000)

--参数检测
if   isnull(@fname, ' ')= ' '   set   @fname=@tbname+ '.xls '

--检查文件是否已经存在
if   right(@path,1) <> '\ '   set   @path=@path+ '\ '
create   table   #tb(a   bit,b   bit,c   bit)
set   @sql=@path+@fname
insert   into   #tb   EXEC   master..xp_fileexist   @sql

--数据库创建语句
set   @sql=@path+@fname
if   exists(select   1   from   #tb   where   a=1)
  set   @constr= 'driver={microsoft   excel   driver   (*.xls)};dsn= ' ' ' ';readonly=false '
              + ';create_db= " '+@sql+ ' ";dbq= '+@sql
else
  set   @constr= 'provider=microsoft.jet.oledb.4.0;extended   properties= "excel   8.0;hdr=yes '
        + ';database= '+@sql+ ' " '

--连接数据库
EXEC   @err=sp_oacreate   'adodb.connection ',@obj   out
if   @err <> 0   goto   lberr

EXEC   @err=sp_oamethod   @obj, 'open ',null,@constr
if   @err <> 0   goto   lberr

/*--如果覆盖已经存在的表,就加上下面的语句
--创建之前先删除表/如果存在的话
select   @sql= 'drop   table   [ '+@tbname+ '] '
EXEC   @err=sp_oamethod   @obj, 'EXECute ',@out   out,@sql
--*/

--创建表的sql
select   @sql= ' ',@fdlist= ' '
select   @fdlist=@fdlist+ ',[ '+a.name+ '] '
  ,@sql=@sql+ ',[ '+a.name+ ']   '
    +case
      when   b.name   like   '%char '
      then   case   when   a.length> 255   then   'memo '
        else   'text( '+cast(a.length   as   varchar)+ ') '   end
      when   b.name   like   '%int '   or   b.name= 'bit '   then   'int '
      when   b.name   like   '%datetime '   then   'datetime '
      when   b.name   like   '%money '   then   'money '
      when   b.name   like   '%text '   then   'memo '
      else   b.name   end
from   syscolumns   a   left   join   systypes   b   on   a.xtype=b.xusertype
where   b.name   not   in( 'image ', 'uniqueidentifier ', 'sql_variant ', 'varbinary ', 'binary ', 'timestamp ')
  and   object_id(@tbname)=id
select   @sql= 'create   table   [ '+@tbname
  + ']( '+substring(@sql,2,8000)+ ') '
  ,@fdlist=substring(@fdlist,2,8000)
EXEC   @err=sp_oamethod   @obj, 'EXECute ',@out   out,@sql
if   @err <> 0   goto   lberr

EXEC   @err=sp_oadestroy   @obj

--导入数据
set   @sql= 'openrowset( ' 'microsoft.jet.oledb.4.0 ' ', ' 'excel   8.0;hdr=yes;imex=1
      ;database= '+@path+@fname+ ' ' ',[ '+@tbname+ '$]) '

EXEC( 'insert   into   '+@sql+ '( '+@fdlist+ ')   select   '+@fdlist+ '   from   '+@tbname)

return

lberr:
  EXEC   sp_oageterrorinfo   0,@src   out,@desc   out
lbexit:
  select   cast(@err   as   varbinary(4))   as   错误号
    ,@src   as   错误源,@desc   as   错误描述
  select   @sql,@constr,@fdlist
go
 
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(n '[dbo].[p_exporttb] ')   and   objectproperty(id,   n 'isprocedure ')   =   1)
drop   procedure   [dbo].[p_exporttb]
go

发表于:2007-06-17 08:00:573楼 得分:0
/*--数据导出excel
 
  导出查询中的数据到excel,包含字段名,文件为真正的excel文件
  如果文件不存在,将自动创建文件
  如果表不存在,将自动创建表
  基于通用性考虑,仅支持导出标准数据类型

--邹建   2003.10(引用请保留此信息)--*/

/*--调用示例

  p_exporttb   @sqlstr= 'select   *   from   地区资料 '
    ,@path= 'c:\ ',@fname= 'aa.xls ',@sheetname= '地区资料 '
--*/
create   proc   p_exporttb
@sqlstr   varchar(8000),       --查询语句,如果查询语句中使用了order   by   ,请加上top   100   percent
@path   nvarchar(1000),       --文件存放目录
@fname   nvarchar(250),       --文件名
@sheetname   varchar(250)= ' '     --要创建的工作表名,默认为文件名
as
declare   @err   int,@src   nvarchar(255),@desc   nvarchar(255),@out   int
declare   @obj   int,@constr   nvarchar(1000),@sql   varchar(8000),@fdlist   varchar(8000)

--参数检测
if   isnull(@fname, ' ')= ' '   set   @fname= 'temp.xls '
if   isnull(@sheetname, ' ')= ' '   set   @sheetname=replace(@fname, '. ', '# ')

--检查文件是否已经存在
if   right(@path,1) <> '\ '   set   @path=@path+ '\ '
create   table   #tb(a   bit,b   bit,c   bit)
set   @sql=@path+@fname
insert   into   #tb   EXEC   master..xp_fileexist   @sql

--数据库创建语句
set   @sql=@path+@fname
if   exists(select   1   from   #tb   where   a=1)
  set   @constr= 'driver={microsoft   excel   driver   (*.xls)};dsn= ' ' ' ';readonly=false '
              + ';create_db= " '+@sql+ ' ";dbq= '+@sql
else
  set   @constr= 'provider=microsoft.jet.oledb.4.0;extended   properties= "excel   8.0;hdr=yes '
        + ';database= '+@sql+ ' " '

--连接数据库
EXEC   @err=sp_oacreate   'adodb.connection ',@obj   out
if   @err <> 0   goto   lberr

EXEC   @err=sp_oamethod   @obj, 'open ',null,@constr
if   @err <> 0   goto   lberr

--创建表的sql
declare   @tbname   sysname
set   @tbname= '##tmp_ '+convert(varchar(38),newid())
set   @sql= 'select   *   into   [ '+@tbname+ ']   from( '+@sqlstr+ ')   a '
EXEC(@sql)

select   @sql= ' ',@fdlist= ' '
select   @fdlist=@fdlist+ ',[ '+a.name+ '] '
  ,@sql=@sql+ ',[ '+a.name+ ']   '
    +case
      when   b.name   like   '%char '
      then   case   when   a.length> 255   then   'memo '
        else   'text( '+cast(a.length   as   varchar)+ ') '   end
      when   b.name   like   '%int '   or   b.name= 'bit '   then   'int '
      when   b.name   like   '%datetime '   then   'datetime '
      when   b.name   like   '%money '   then   'money '
      when   b.name   like   '%text '   then   'memo '
      else   b.name   end
from   tempdb..syscolumns   a   left   join   tempdb..systypes   b   on   a.xtype=b.xusertype
where   b.name   not   in( 'image ', 'uniqueidentifier ', 'sql_variant ', 'varbinary ', 'binary ', 'timestamp ')
  and   a.id=(select   id   from   tempdb..sysobjects   where   name=@tbname)

if   @@rowcount=0   return

select   @sql= 'create   table   [ '+@sheetname
  + ']( '+substring(@sql,2,8000)+ ') '
  ,@fdlist=substring(@fdlist,2,8000)

EXEC   @err=sp_oamethod   @obj, 'EXECute ',@out   out,@sql
if   @err <> 0   goto   lberr

EXEC   @err=sp_oadestroy   @obj

--导入数据
set   @sql= 'openrowset( ' 'microsoft.jet.oledb.4.0 ' ', ' 'excel   8.0;hdr=yes
      ;database= '+@path+@fname+ ' ' ',[ '+@sheetname+ '$]) '

EXEC( 'insert   into   '+@sql+ '( '+@fdlist+ ')   select   '+@fdlist+ '   from   [ '+@tbname+ '] ')

set   @sql= 'drop   table   [ '+@tbname+ '] '
EXEC(@sql)
return

lberr:
  EXEC   sp_oageterrorinfo   0,@src   out,@desc   out
lbexit:
  select   cast(@err   as   varbinary(4))   as   错误号
    ,@src   as   错误源,@desc   as   错误描述
  select   @sql,@constr,@fdlist
go


----excel中的数据如何导入到oracle数据库中
首先得说一下关于excel中的数据直接导入到表中的规范
1:一行记录对应数据库为一条记录,不能使用合并单元格.
2:不能允许有标题,而是直接写出列名的值,列名顺序与值要一一对应.
3:对于某一列的值如果全为空的话,可用另一文件加以说明,不能在此文件中写.
4:只能留一个列表,在保存时必须选择保存的类型为csv(逗号分隔)(*.csv)这种类型来保存.
其次.当excel文件建立好以后将它保存在本机的一个逻辑盘中如(d盘根目录下)
新建一个文本编辑器窗口输入以下
load   data   infile   'book1.csv '   append   into   table   work_yh.t_temp_test   fields   terminated   by   ', '   trailing   nullcols   (id,payerid,names,note)
然后保存时请选择保存类型为所有文件,输入一个名称为.ctl后缀的文件名即可.
(其中 'book1.csv '   为excel保存的文件名,无需写路径,这个文件要保证和此文件在一个目录下即可.work_yh.t_temp_test   指明哪个方案中的哪张表.trailing   nullcols   为允许最结尾的列值为空.)
最后通过在cmd命令格式下进行以上文件所在的盘符如d盘目录下.输入sqlldr   userid=work_yh@workflow/work_yh   control=load.ctl
按回车确认等待完成即可.
(其中work_yh@workflow/work_yh对应的为用户名@服务器字符串/密码)
可以通过log文件来查看记录是否成功导入以及未成功导入的记录有几条和不能导入的原因.还可通过bad文件来查看具体哪些记录没有成功导入.

注:对于日期格式类型的可以在ctl文件中最后对应字段这样写:   (id,timestamp   date   "yyyy-mm-dd   hh24:mi:ss ",info).
至此完成了excel中的数据导入到oracle库中的操作.


快速检索

最新资讯
热门点击