SQLServer2000把指定查询输出为Excel文件的存储过程
2007-05-16 11:12
507 查看
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER proc stp_ExportTable
@sqlstr nvarchar(4000), --查询语句,如果查询语句中使用了order by ,请加上top 100 percent,注意,如果导出表/视图,用上面的存储过程
@orderstr nvarchar(255), --Order by Field
@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(4000),@fdlist varchar(8000)
declare @IstmpTB as bit
declare @tmpsql as varchar(4000)
SET @IstmpTB=0
--参数检测
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+'"'
--连接数据库
--print 'nn33'
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberr
--print 'nn44'
exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 goto lberr
--构造temp表的SQL
declare @tbname sysname
set @tbname='##tmp_'+convert(varchar(38),newid())
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
--print @sql
exec(@sql)
set @IstmpTB=1
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('bit','int','bigint','tinyint','smallint') then 'int'
when b.name in('smalldatetime','datetime') then 'datetime'
when b.name in('money','smallmoney') then 'money'
else b.name end
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype
where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and a.id=(select id from tempdb..sysobjects where name=@tbname)
select @sql=substring(@sql,2,2000),@fdlist=substring(@fdlist,2,2000)
--create table
select @sql='create table ['+@sheetname+']('+@sql+')'
--print @sql
exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberr
--print 'nn'
--destroy ole object
exec @err=sp_oadestroy @obj
if @err<>0 goto lberr
--print 'nn1'
--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'
set @tmpsql='insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']'
--print @tmpsql
if @orderstr is not null or @orderstr<>''
begin
set @tmpsql=@tmpsql+' order by '+@orderstr
end
--print @tmpsql
exec(@tmpsql)
set @sql='drop table ['+@tbname+']'
exec(@sql)
set @IstmpTB=0
return 0
lberr:
EXEC sp_displayoaerrorinfo @obj, @err
--DELETE TmpTable While Error
IF @IstmpTB=1
BEGIN
set @sql='drop table ['+@tbname+']'
exec(@sql)
END
return -1
lbexit:
SELECT @sql,@constr,@fdlist
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
相关文章推荐
- SQLSERVER,不使用BCP,把查询结果输出为txt文本文件的存储过程
- 使用SAS存储过程直接输出excel文件最简单的方法
- PHP如何查询MySQL数据页面并输出内容到页面,并另存为CSV或EXCEL文件
- SqlServer删除所有存储过程和所有表、查询表是否存在指定的记录及UPDATE语句
- 根据指定表指定列查询数据的通用存储过程
- 利用存储过程读指定文件夹里所有txt文件,将数据插入数据库中
- 电话号码归属地查询--存储过程带输出参数
- 存储过程中对输出参数拼sql语句查询
- SQL Server 2000通用分页查询存储过程(可指定返回字段,查询条件)
- 这两天写的mybatis配置文件,主要是有输出和输入的存储过程
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- oracle存储过程执行中输出日志文件
- Sql存储查询数据导出Excel文件(注意:有几百万条数据)
- bat 文件调用有输出参数的oralce存储过程
- 在存储过程服务器中输出PDF,CSV,RTF文件
- 调用存储过程中的输出参数必须指定参数方向
- oracle 存储过程 输出结果和正常查询不一样
- 查询指定数据库的所有存储过程和参数
- 存储过程输出查询语句过程的固定形式
- CSDN上面的一段导出Excel格式文件的存储过程