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 @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 5.0;HDR=YES'
+';DATABASE='+@sql+'"'--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberrexec @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 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 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='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 lberrexec @err=sp_oadestroy @obj--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')set @sql='drop table ['+@tbname+']'
exec(@sql)
returnlberr:
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

解决方案 »

  1.   

    --先创建好上面的存储过程,然后就可以这样导出数据了:declare @s varchar(8000)
    set @s='select 项目名称'
    select @s=@s+',['+单位名称+']=sum(case 单位名称 when '''+单位名称+''' then 数量 end)'
    from 原表 group by 单位名称
    set @s=@s+' from 原表 group by 项目名称'--导出到c:\aa.xls,工作表名为 资料
    exec p_exporttb @sqlstr=@s
    ,@path='c:\',@fname='aa.xls',@sheetname='资料'
      

  2.   

    这段代码在DELPHI中怎么写,怎么会有两个"from 原表 group by 单位名称"
    我是怎么写的,但老是不对,请再指教一下.
    var
      str_Query: string;
    begin
         ADOQuery1.Close;
         //str_Query:='select * from  SW_NYFWMX_MX';
         str_Query:='select 项目';
         str_Query:=str_Query+',['+'关联序号'+']=sum(case 关联序号 when '''+'关联序号'+''' then 数量 end ) FROM SW_NYFWMX_MX group BY 关联序号,项目,数量 ';
         str_Query:=str_Query+'FROM SW_NYFWMX_MX group BY 项目,关联序号,数量';
         Edit1.Text:=str_Query;
         ADOQuery1.SQL.Add(str_Query) ;
         ADOQuery1.Open;
      

  3.   

    str_Query:=str_Query+',['+'关联序号'+']=sum(case 关联序号 when '''+'关联序号'+''' then 数量 end ) FROM SW_NYFWMX_MX group BY 关联序号,项目,数量 ';  //这里一个group by  str_Query:=str_Query+'FROM SW_NYFWMX_MX group BY 项目,关联序号,数量'; //这里还有一个
      

  4.   

    而且你的代码根本不能实现所要的功能,程序的变量不能和SQL中的变量混用.
    要么你全部用程序实现,要么全部用SQL语句实现.
      

  5.   

    var
      str_Query: string;
    begin
         ADOQuery1.Close;
         str_Query:='declare @s varchar(8000);';
         str_Query:=str_Query+'set @s=''select 项目名称'';';
         str_Query:=str_Query+'select @s=@s+'',[''+单位名称+'']=sum(case 单位名称 when ''''''+单位名称+'''''' then 数量 end)'';';
         str_Query:=str_Query+'from 原表 group by 单位名称;';
         str_Query:=str_Query+'set @s=@s+'' from 原表 group by 项目名称'';';
         Edit1.Text:=str_Query;
         ADOQuery1.SQL.Add(str_Query) ;
         ADOQuery1.Open;
      

  6.   

    还是不行,报错"在关键字'from'附近有语发错误".请在帮我看看.
    var
      str_Query: string;
    begin
         ADOQuery1.Close;
         str_Query:='declare @s varchar(8000);';
         str_Query:=str_Query+'set @s=''select 项目'';';
         str_Query:=str_Query+'select @s=@s+'',[''+关联序号+'']=sum(case 关联序号 when ''''''+关联序号+'''''' then 数量 end)'';';
         str_Query:=str_Query+' from SW_NYFWMX_MX group by 关联序号;';
         str_Query:=str_Query+'set @s=@s+'' from SW_NYFWMX_MX group by 项目'';';
         Edit1.Text:=str_Query;
         ADOQuery1.SQL.Add(str_Query) ;
         ADOQuery1.Open;
      

  7.   

    你自己检查一下吧,DELPHI 代码我不会写,上面的代码是我猜的