<script type="text/javascript">
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
/*--数据导出 EXCEL
导出查询中的数据到,包含字段名,文件为真正的 EXCEL文件
,如果文件不存在,将自动创建文件
,如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型
作者:邹建
--*/
/*--调用示例
p_exporttb@sqlstr='select*from地区资料'
,@path='c:/',@fname='aa.xls',@sheetname='地区资料'
--*/
createprocp_exporttb
@tbnamesysname, --要导出的表名
@pathnvarchar(1000), --文件存放目录
@fnamenvarchar(250)='' --文件名,默认为表名
as
declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint
declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000)
--参数检测
ifisnull(@fname,'')=''set@fname=@tbname+'.xls'
--检查文件是否已经存在
ifright(@path,1)<>''set@path=@path+''
createtable#tb(abit,bbit,cbit)
set@sql=@path+@fname
insertinto#tbexecmaster..xp_fileexist@sql
--创建语句
set@sql=@path+@fname
ifexists(select1from#tbwherea=1)
set@constr='DRIVER={Microsoft EXCELDriver(*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set@constr='Provider=Microsoft.Jet.OLEDB.4.0;ExtendedProperties=" EXCEL8.0;HDR=YES'
+';DATABASE='+@sql+'"'
--连接数据库
exec@err=sp_oacreate'adodb.connection',@objout
if@err<>0gotolberr
exec@err=sp_oamethod@obj,'open',null,@constr
if@err<>0gotolberr
/*--如果覆盖已经存在的表,就加上下面的语句
--创建之前先删除表/如果存在的话
select@sql='droptable['+@tbname+']'
exec@err=sp_oamethod@obj,'execute',@outout,@sql
--*/
--创建表的SQL
select@sql='',@fdlist=''
select@fdlist=@fdlist+',['+a.name+']'
,@sql=@sql+',['+a.name+']'
+casewhenb.namein('char','nchar','varchar','nvarchar')then
'text('+cast(casewhena.length>255then255elsea.lengthendasvarchar)+')'
whenb.namein('tynyint','int','bigint','tinyint')then'int'
whenb.namein('smalldatetime','datetime')then'datetime'
whenb.namein('money','smallmoney')then'money'
elseb.nameend
FROMsyscolumnsaleftjoinsystypesbona.xtype=b.xusertype
whereb.namenotin('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
andobject_id(@tbname)=id
select@sql='createtable['+@tbname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec@err=sp_oamethod@obj,'execute',@outout,@sql
if@err<>0gotolberr
exec@err=sp_oadestroy@obj
--导入数据
set@sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'','' EXCEL8.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@tbname+'$])'
exec('insertinto'+@sql+'('+@fdlist+')select'+@fdlist+'from'+@tbname)
return
lberr:
execsp_oageterrorinfo0,@srcout,@descout
lbexit:
selectcast(@errasvarbinary(4))as错误号
,@srcas错误源,@descas错误描述
select@sql,@constr,@fdlist
GO
========================================
NinGoo注:
EXCEL文件每个工作表不能超过65536条记录
解决办法: 1
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
/*--数据导出 EXCEL
导出查询中的数据到,包含字段名,文件为真正的 EXCEL文件
,如果文件不存在,将自动创建文件
,如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型
作者:邹建
--*/
/*--调用示例
p_exporttb@sqlstr='select*from地区资料'
,@path='c:/',@fname='aa.xls',@sheetname='地区资料'
--*/
createprocp_exporttb
@tbnamesysname, --要导出的表名
@pathnvarchar(1000), --文件存放目录
@fnamenvarchar(250)='' --文件名,默认为表名
as
declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint
declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000)
--参数检测
ifisnull(@fname,'')=''set@fname=@tbname+'.xls'
--检查文件是否已经存在
ifright(@path,1)<>''set@path=@path+''
createtable#tb(abit,bbit,cbit)
set@sql=@path+@fname
insertinto#tbexecmaster..xp_fileexist@sql
--创建语句
set@sql=@path+@fname
ifexists(select1from#tbwherea=1)
set@constr='DRIVER={Microsoft EXCELDriver(*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set@constr='Provider=Microsoft.Jet.OLEDB.4.0;ExtendedProperties=" EXCEL8.0;HDR=YES'
+';DATABASE='+@sql+'"'
--连接数据库
exec@err=sp_oacreate'adodb.connection',@objout
if@err<>0gotolberr
exec@err=sp_oamethod@obj,'open',null,@constr
if@err<>0gotolberr
/*--如果覆盖已经存在的表,就加上下面的语句
--创建之前先删除表/如果存在的话
select@sql='droptable['+@tbname+']'
exec@err=sp_oamethod@obj,'execute',@outout,@sql
--*/
--创建表的SQL
select@sql='',@fdlist=''
select@fdlist=@fdlist+',['+a.name+']'
,@sql=@sql+',['+a.name+']'
+casewhenb.namein('char','nchar','varchar','nvarchar')then
'text('+cast(casewhena.length>255then255elsea.lengthendasvarchar)+')'
whenb.namein('tynyint','int','bigint','tinyint')then'int'
whenb.namein('smalldatetime','datetime')then'datetime'
whenb.namein('money','smallmoney')then'money'
elseb.nameend
FROMsyscolumnsaleftjoinsystypesbona.xtype=b.xusertype
whereb.namenotin('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
andobject_id(@tbname)=id
select@sql='createtable['+@tbname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec@err=sp_oamethod@obj,'execute',@outout,@sql
if@err<>0gotolberr
exec@err=sp_oadestroy@obj
--导入数据
set@sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'','' EXCEL8.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@tbname+'$])'
exec('insertinto'+@sql+'('+@fdlist+')select'+@fdlist+'from'+@tbname)
return
lberr:
execsp_oageterrorinfo0,@srcout,@descout
lbexit:
selectcast(@errasvarbinary(4))as错误号
,@srcas错误源,@descas错误描述
select@sql,@constr,@fdlist
GO
========================================
NinGoo注:
EXCEL文件每个工作表不能超过65536条记录
解决办法: 1
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>