首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

从SQLServer 导入/导出 Excel 的方法,该如何处理

2012-02-08 
从SQLServer导入/导出 Excel 的方法最近在晚上看了一篇文章(从SQLServer导入/导出Excel的方法):但是把源码

从SQLServer 导入/导出 Excel 的方法
最近在晚上看了一篇文章(从SQLServer     导入/导出   Excel   的方法   ):   但是把源码拷贝过来后   出现很多错误   改了好久也没亚成功!   不知道那位高人   能帮忙看看   并帮忙测试一下后   把源码贴出来供小弟看看   也好给大家分享一下!

下面是   网络源码:


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=“         +’;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   in(’char’,’nchar’,’varchar’,’nvarchar’)   then
          ’text(’+cast(case   when   a.length〉255   then   255   else   a.length   end   as   varchar)+’)’
      when   b.name   in(’tynyint’,’int’,’bigint’,’tinyint’)   then   ’int’
      when   b.name   in(’smalldatetime’,’datetime’)   then   ’datetime’
      when   b.name   in(’money’,’smallmoney’)   then   ’money’
      else   b.name   end
FROM   syscolumns   a   left   join   systypes   b   on   a.xtype=b.xusertype
where   b.name   not   in(’image’,’text’,’uniqueidentifier’,’sql_variant’,’ntext’,’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   5.0;HDR=YES
      ;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


[解决办法]
作 用:把sql语句查询出的结果导到Excel中包含字段名称
Create By:Hchuan
Script Date:2006-08-30

执行示例:

declare @sql varchar(8000)
set @sql = 'select top 100 percent * from ptype order by typeid '
Exec H_SqlToExcel 'f:\ ', '商品档案.xls ', '商品档案 ',@sql

*/
if exists (select * from dbo.sysobjects where id = object_id(N '[dbo].[H_SqlToExcel] ') and OBJECTPROPERTY(id, N 'IsProcedure ') = 1)
drop procedure [dbo].[H_SqlToExcel]
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

CREATE PROC H_SqlToExcel
(
@Path varchar(100),--文件存放路径
@Fname varchar(100),--文件名字
@SheetName varchar(80),---工作表名字
@SqlStr varchar(8000)--查询语句,如果查询语句中使用了order by ,请加上top 100 percent,注意,如果导出表/视图,用上面的存储过程
)
AS
SET NOCOUNT ON

declare @sql varchar(8000)
declare @obj int--OLE对象
declare @constr varchar(8000)
declare @err int
declare @out int
declare @fdlist varchar(8000)
declare @tbname sysname--临时表
declare @Src nvarchar(200)
declare @Desc nvarchar(200)

set @tbname= '##tmp_ '+convert(varchar(38),newid())

exec( 'select * into [ '+@tbname + '] from '+ '( '+@sqlStr+ ') A ')

select @fdlist = ' '

set @sql= @path+@fname
set @constr= 'DRIVER={Microsoft Excel Driver (*.xls)};DSN= ' ' ' ';READONLY=FALSE '
+ ';CREATE_DB= " '+@sql+ ' ";DBQ= '+@sql

--生成Excel的列
set @sql = ' '
select @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,
@fdlist = @fdlist+ ', '+ '[ '+a.name+ '] '
from tempdb..syscolumns a join tempdb..systypes b on a.xtype = b.xusertype
where b.name not in( 'image ', 'uniqueidentifier ', 'sql_variant ', 'varbinary ', 'binary ', 'timestamp ')
and id in(select id from tempdb..sysobjects where name = @tbname) order by colorder
if @@rowcount=0 return

set @fdlist = substring(@fdlist,2,8000)



--连接数据库
exec @err=sp_oacreate 'adodb.connection ',@obj out
if @err <> 0 goto lberror
exec @err=sp_oamethod @obj, 'open ',null,@constr
if @err <> 0 goto lberror
--创建工作薄
select @sql= 'create table [ '+@sheetname
+ ']( '+substring(@sql,2,8000)+ ') '

exec @err=sp_oamethod @obj, 'execute ',@out out,@sql--@sql为excute方法提供参数

if @err <> 0 goto lberror

exec @err=sp_oadestroy @obj

--导入数据
set @sql= 'openrowset( ' 'MICROSOFT.JET.OLEDB.4.0 ' ', ' 'Excel 8.0;HDR=YES
;DATABASE= '+@path+@fname+ ' ' ',[ '+@sheetname+ '$]) '
--print @sql
exec ( 'insert into '+@sql+ '( '+@fdlist+ ') select '+@fdlist+ ' from [ '+@tbname+ '] ')

exec( 'drop table [ '+@tbname+ '] ')
return


lberror:
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

热点排行