ke10

  相信大家常常会遇到将SqlServer查询结果导出到Excel的问题。如果导出的次数少,直接“Save Results As...”就是了;但是当要分别在每个表取样,那就相当麻烦了。今天就为大家提供一个脱离office组件的可以将语句结果导出到Excel的过程,希望会对大家有帮助!

---导出到Excel
---使用说明:
--        1.执行时所连接的服务器决定文件存放在哪个服务器
--        2.远程查询语句中,要加上数据库名
--更新:
--        2013.01.05:增加csv文件的支持

ALTER PROC ExportFile 
     @QuerySql VARCHAR(max)
    ,@Server VARCHAR(20) 
    ,@User VARCHAR(20) = \'sa\'
    ,@Password VARCHAR(20)
    ,@FilePath NVARCHAR(100) = \'c:\ExportFile.csv\'
AS
    DECLARE @tmp VARCHAR(50) = \'[##Table\' + CONVERT(VARCHAR(36),NEWID())+\']\'
    BEGIN TRY
        DECLARE @Sql VARCHAR(max),@DataSource VARCHAR(max)=\'\';
        --判断是否为远程服务器
        IF @Server <> \'.\' AND @Server <> \'127.0.0.1\'
            SET @DataSource = \'OPENDATASOURCE(\'\'SQLOLEDB\'\',\'\'Data Source=\'+@Server+\';User ID=\'+@User+\';Password=\'+@Password+\'\'\').\'
        --将结果集导出到指定的数据库
        SET @Sql = REPLACE(@QuerySql,\' from \',\' into \'+@tmp+ \' from \' + @DataSource)
        PRINT @Sql
        EXEC(@Sql)
        
        DECLARE @Columns VARCHAR(max) = \'\',@Data NVARCHAR(max)=\'\'
        SELECT @Columns = @Columns + \',\'\'\' + name +\'\'\'\'--获取列名(xp_cmdshell导出文件没有列名)
            ,@Data = @Data + \',Convert(Nvarchar,[\' + name +\'])\'--将结果集所在的字段更新为nvarchar(避免在列名和数据union的时候类型冲突)
        FROM tempdb.sys.columns WHERE object_id = OBJECT_ID(\'tempdb..\'+@tmp)
        SELECT @Data  = \'SELECT \' + SUBSTRING(@Data,2,LEN(@Data)) + \' FROM \' + @tmp
        SELECT @Columns =  \'Select \' + SUBSTRING(@Columns,2,LEN(@Columns))
        --使用xp_cmdshell的bcp命令将数据导出
        EXEC sp_configure \'xp_cmdshell\',1
        RECONFIGURE
        DECLARE @cmd NVARCHAR(4000) = \'bcp "\' + @Columns+\' Union All \' + @Data+\'" queryout \' + @FilePath + \' -c\' + CASE WHEN RIGHT(@FilePath,4) = \'.csv\' THEN \' -t,\' ELSE \'\' END + \' -T\'
        PRINT @cmd
        exec sys.xp_cmdshell @cmd
        EXEC sp_configure \'xp_cmdshell\',0
        RECONFIGURE
        EXEC(\'DROP TABLE \' + @tmp)
    END TRY
    BEGIN CATCH
        --处理异常
        IF OBJECT_ID(\'tempdb..\'+@tmp) IS NOT NULL
            EXEC(\'DROP TABLE \' + @tmp)
        EXEC sp_configure \'xp_cmdshell\',0
        RECONFIGURE
        
        SELECT ERROR_MESSAGE()
    END CATCH
    
    

 

先不要着急使用,该版本是基于xp_cmdshell的,因为要创建文件,所以要保证你的用户能有文件管理的权限,通常简单点的方法就是将sql server的启动用户设置为本地系统用户

 

好了,现在我们来执行看看:

--查询分析器连接哪个服务器,文件就在哪个服务器上
--本地导出
EXEC dbo.ExportFile @QuerySql = \'select * from sys.objects\', -- varchar(max)
    @Server = \'.\', -- varchar(20)
    @FilePath = N\'c:\objects.xls\' -- nvarchar(100)

--远程导出
EXEC dbo.ExportFile @QuerySql = \'select * from master.sys.objects\', -- varchar(max)
    @Server = \'192.168.1.52\', -- varchar(20)
    @User = \'sa\', -- varchar(20)
    @Password = \'sa\', -- varchar(20)
    @FilePath = N\'c:\52objects.xls\' -- nvarchar(100)

执行结果如下,显示导出条数,就没有报错,再看看你的C盘,多了2个文件就大功告成了:

 

另外,大家把输出文件的类型改成其他试试(例如.txt或.csv),是吧,会有不同的输出结果哦。

符xp_cmdshell bcp参数说明:

用法: bcp {dbtable | query} {in | out | queryout | format} 数据文件

  [-m 最大错误数]            [-f 格式化文件]         [-e 错误文件]
  [-F 首行]                    [-L 末行]             [-b 批大小]
  [-n 本机类型]               [-c 字符类型]         [-w 宽字符类型]
  [-N 将非文本保持为本机类型] [-V 文件格式版本]     [-q 带引号的标识符]
  [-C 代码页说明符]           [-t 字段终止符]       [-r 行终止符]
  [-i 输入文件]               [-o 输出文件]         [-a 数据包大小]
  [-S 服务器名称]             [-U 用户名]           [-P 密码]
  [-T 可信连接]               [-v 版本]             [-R 允许使用区域设置]
  [-k 保留空值]               [-E 保留标识值]
  [-h"加载提示"]              [-x 生成xml 格式化文件]

分类:

技术点:

相关文章:

  • 2021-12-05
  • 2021-09-27
  • 2021-12-04
  • 2021-12-26
  • 2021-12-02
  • 2021-12-02
  • 2021-12-02
  • 2021-12-02
猜你喜欢
  • 2021-12-14
  • 2021-12-02
  • 2021-12-02
  • 2021-12-02
  • 2021-12-14
  • 2021-12-02
  • 2021-08-23
相关资源
相似解决方案