TSQL - 将查询结果导出为 xls / xslx / csv

3
我有一个复杂的动态查询需要在TSQL中导出到Excel。 [结果表中包含超过255个字符的文本字段,如果有影响的话]
我知道可以使用Management Studio菜单导出结果,但我想通过代码自动完成。你知道怎么做吗?
提前致谢。
4个回答

2
您可以查看 sp_send_dbmail。该方法允许您在查询运行后发送电子邮件,其中包含结果集的附加CSV文件。显然,此方法的可行性取决于结果集的大小。
来自链接文档的示例:
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'AdventureWorks2008R2 Administrator',
@recipients = 'danw@Adventure-Works.com',
@query = 'SELECT COUNT(*) FROM AdventureWorks2008R2.Production.WorkOrder
              WHERE DueDate > ''2006-04-30''
              AND  DATEDIFF(dd, ''2006-04-30'', DueDate) < 2' ,
@subject = 'Work Order Count',
@attach_query_result_as_file = 1 ;

谢谢。我在系统的其他部分使用了那个选项,但这次我真的需要系统输出csv xls文件,这样没有太多技术知识的员工就可以简单地打开它。 - orshachar
您应该能够通过设置结果分隔符字段,使此方法输出为普通的csv格式。我们目前在一个系统中使用它,将csv文件通过电子邮件发送给非技术用户,他们可以在Excel中打开。请参见http://dbaspot.com/forums/sqlserver-programming/383582-sp_send_dbmail-attachment-issue.html以了解如何实现,否则我会在几天后回到办公室查看我们的实现并与您联系。 - Simon

1

一种方法是使用bcp,您可以从命令行调用它-请查看该参考中的示例,特别是查看有关-t参数的信息,您可以使用该参数设置字段终止符(对于CSV)。 这里有一个关于指定字段和行终止符的链接参考。

或者,直接使用TSQL,您可以使用OPENROWSET 如Pinal Dave在此处所解释的那样

更新: 关于:2008 64位和OPENROWSET-我不知道那个,快速挖掘在MSDN论坛上找到了一个给定的链接。 任何帮助?

除此之外,其他选项包括编写SSIS包或使用SQL CLR在.NET中编写导出过程以直接从SQL调用。或者,您可以通过xp_cmdshell从TSQL调用bcp - 不过您必须启用它,这将打开SQL Server可能的“攻击面”。我建议查看this discussion


谢谢。我更喜欢直接使用TSQL来解决问题。问题在于Pinal的方法不适用于SQL Server 2008 64位版本。 - orshachar
所以,如果我理解正确——问题的关键是似乎没有解决方案。有趣的是,我成功地使用菜单生成了一个很棒的 CSV 文件,肯定有办法解决这个问题。 - orshachar
@Or Shachar - 我相当确定当您通过UI执行时,它只是调用BCP。因此,您可以像上面那样使用xp_cmdshell从BCP执行该操作。 - AdaTheDev

1

0

我需要接受一个动态查询并将结果保存到磁盘,以便通过网络应用程序下载。

插入数据源对我来说行不通,因为我一直在努力使其工作。

最终,我选择了从SSMS将查询发送到powershell

阅读我的帖子如何在R2008 sql服务器上运行现有存储过程或该过程的sql语句创建服务器上的文档

然而单引号是个问题,起初我没有修整查询并在一行上写出它,所以在SQL Studio中它有换行符,事实上这很重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接