select c.code,c.name,sum(isnull(b.debitquantity,0)),sum(isnull(b.creditquantity,0)),sum(isnull(b.price,0)),sum(isnull(b.debitamount,0)),sum(isnull(b.creditamount,0))
    from t_fn_voucher as a
  left join t_fn_voucher_detail as b on b.fn_voucher_id=a.id
  left join t_bs_accountingsubject as c on b.bs_accountingsubject_id=c.id
这是我在一个存储过程中所查询的表数据,请教如何导出到execl表中。

解决方案 »

  1.   

    --先把查询的数据,存入临时表.EXEC('EXEC master..xp_cmdshell ''bcp " SELECT * FROM TEmpdb..##Temp " queryout "c:\数据.xls" -c -q -S(local) -Usa -P密码'' ')
      

  2.   

    exec master..xp_cmdshell 'select * from 表名 queryout d:\xx.xls -c -q -S"" -U"sa" -P"密码"'
      

  3.   

    直接存就是了.sql查询分析器>"查询"菜单>选中结果保存为文件.
    执行查询,会弹出保存框,选择所有文件类型,然后输入x.xls就行了.
      

  4.   

    还有个办法打开Excel,数据——>导入外部数据->外部数据。
      

  5.   


    --导出excel处理
    declare @s nvarchar(4000)
    set @s='bcp "'+
    +N'select top 100 percent '
    +N' case c.colid when 1 then o.name else N'''' end as 表名,'
    +N' c.colid as 序号,'
    +N' c.name as 字段名,'
    +N' t.name 数据类型,'
    +N' c.prec as 长度,'
    +N' p.value as 字段说明,'
    +N' m.text as 默认值'
    +N' from '+quotename(@dbname)+N'.dbo.sysobjects o'
    +N' inner join '+quotename(@dbname)+N'.dbo.syscolumns c on o.id=c.id'
    +N' inner join '+quotename(@dbname)+N'.dbo.systypes t on c.xusertype=t.xusertype'
    +N' left join '+quotename(@dbname)+N'.dbo.sysproperties p on c.id=p.id and c.colid = p.smallid'
    +N' left join '+quotename(@dbname)+N'.dbo.syscomments m on c.cdefault=m.id'
    +N' where o.xtype in(N''U'') and o.status>=0'
    +N' order by c.id,c.colid'
    +N'" queryout "'+@fname
    +N'" /P"" /w'
    exec master..xp_cmdshell @s,no_output
    go
    --查询
    sqlserver中直接通过代码访问excel
    SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions甚至可以:
    DELETE 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    你还可以:EXEC sp_addlinkedserver 'ExcelSource',
       'Jet 4.0',
       'Microsoft.Jet.OLEDB.4.0',
       'c:\Temp\Part.xls',
       NULL,
       'Excel 5.0'
    GOEXEC sp_addlinkedsrvlogin 'excelsource', 'false', NULL, NULL, NULL在excel中选定范围,选择菜单'插入'->'名称'->'定义'示例SELECT *
    FROM EXCEL...SalesData  (整页使用 Sheet1$) 如果碰到转换为NULL值请使用文本文件来做DTS转换
      

  6.   

    如果只是简单的导出,那么DTS或者SSIS就够了,
    如果在SP中直接导出的花,那么就要用到老乌龟说的用T-SQL脚本来导出.
      

  7.   

    别人的 改的你自己改改就可以了
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO/*--数据导出EXCEL
    导出表中的数据到Excel,包含字段名,文件为真正的Excel文件
    ,如果文件不存在,将自动创建文件
    ,如果表不存在,将自动创建表
    基于通用性考虑,仅支持导出标准数据类型
    --邹建 2003.10(引用请保留此信息)--*/
    /*--调用示例
    p_exporttb @SqlTableName='地区资料',@filePath='c:\',@excelTableName='aa.xls'
    --*/
    ALTER                proc p_exporttb
    @SqlTableName sysname,--要导出的表名
    @filePath nvarchar(1000),--文件存放目录
    @excelTableName nvarchar(250)='',--文件名
    @excelSheetName nvarchar(250) = 'sheet1' , --表名 
    @tmBgn datetime = '1970-1-1 8:00',
    @tmEnd  datetime = '1970-1-1 8:00'
    as
    declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
    declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)
    declare @ibgn int
    declare @iend int
    declare @filterstr nvarchar(255)
    --参数检测
    if isnull(@excelTableName,'')=''set @excelTableName=@SqlTableName+'.xls'select @ibgn = datediff(ss,'1970-1-1 8:00',@tmBgn)
    select @iend = datediff(ss,'1970-1-1 8:00',@tmend)
    select @filterstr = ' where EventTime >' +cast(@ibgn as varchar(12))+ ' and EventTime <' + cast(@iend as varchar(12))
    --检查文件是否已经存在
    if right(@filePath,1)<>'\' set @filePath=@filePath+'\'
    create table #tb(a bit,b bit,c bit)
    set @sql=@filePath+@excelTableName
    insert into #tb exec master..xp_fileexist @sql
    --数据库创建语句
    set @sql=@filePath+@excelTableName
    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 ['+@excelSheetName+']'
    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(@SqlTableName)=id
    select @sql='create table ['+@excelSheetName
    +']('+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='+@filePath+@excelTableName+''',['+@excelSheetName+'$])'if(@iBgn > 0 and @iEnd > 0)
    begin
    exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@SqlTableName + @filterstr)
            exec(' delete from '+@SqlTableName + @filterstr)
    end
    else
    begin
    exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@SqlTableName )
    exec(' delete from '+@SqlTableName)
    end
    print @filterstr
    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,@fdlistGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
      

  8.   


    ctrl c 和 ctrl v 就OK哈  偶一般放程序里面去做
    虽然研究不深,但是个人觉得这种做法增加服务器负担不值得