将选择结果写入 csv 文件

Sky*_*Sky 44 sql-server-2008 t-sql

我们需要将 SELECT 查询结果写入一个 csv 文件。如何在 SQL Server 2008 r2 中使用 T-SQL 来完成?我知道它可以在 SSIS 中完成,但由于某些原因,我们没有这个选项。

我尝试使用下面文章中建议的 proc,但是当我运行该 proc 时,SQL 抱怨无法运行在此 proc 中调用的 sys.sp_OACreate 和 sys.sp_OADestroy。

您知道我们如何打开这些组件或知道使用 T-SQL 写入文件的更好方法吗?

提前致谢。

RK *_*ala 58

使用BCP 实用程序

bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T
Run Code Online (Sandbox Code Playgroud)

-c参数指定Ç haracter输出,而不是SQL的原始二进制格式; 此默认为制表符分隔的值,但-t ,改变了场erminator到逗号。 -T指定Windows身份验证(“牛逼生锈连接”),否则使用-U MyUserName -P MyPassword

默认情况下,这不会导出列标题。您需要对标题使用 UNION ALL

或者

使用 SQLCMD

SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable"
-s "," -o "D:\MyData.csv" 
Run Code Online (Sandbox Code Playgroud)

或者

使用 Powershell

这是一篇文章链接。如果您最终使用它,您可能希望在输出文件中添加-notype之后Export-Csv $extractFile删除不必要的列。

  • +1 对于 BCP 实用程序 - 它非常易于使用,它是我曾经用于导出/导入信息的最快工具,并且有很多选项。我会建议您在语句的末尾添加“> FileName.log” - 这将创建一个日志文件。 (4认同)

Mar*_*ian 26

添加到先前的答案,它可以帮助您自动化操作,如果您只是偶尔需要它,您可以在 Management Studio 中执行它,只需右键单击标题 - 将结果另存为 -> 选择一个 .csv 文件

或者,如果您想为您运行的每个 select 语句执行此操作,您可以将结果的输出方向更改为文件。使用Tools -> Options -> Query Results - Results to file

另一种可以轻松自动化并利用 SSIS 的方法是使用 Management Studio 的导出数据功能。右键单击数据库-> 任务-> 导出数据。那里有一个有很多选项的向导。您应该选择源数据库、目标和其他选项。对于目的地,请确保它是“平面文件”,浏览并选择 .csv 类型,选择您需要的任何格式,最后您将获得一个可以在本地保存并根据需要重复的 SSIS 包。


小智 11

使用 T-SQL

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName
Run Code Online (Sandbox Code Playgroud)

但是,有几个警告:

  1. 您需要有可用的 Microsoft.ACE.OLEDB.12.0 提供程序。Jet 4.0 提供程序也可以使用,但它很古老,所以我改用了这个。
  2. .CSV 文件必须已经存在。如果您使用标题 (HDR=YES),请确保 .CSV 文件的第一行是所有字段的分隔列表。


小智 6

技术含量低,但...

select
   col1 + ','
+  cast(col2 as varchar(10)) + ','
+  col3
from mytable;
Run Code Online (Sandbox Code Playgroud)


Sha*_*lle 5

看起来您已经有了一个可以接受的解决方案,但是如果您设置了 db 邮件,您可能会执行以下操作:

EXEC msdb.dbo.sp_send_dbmail
    @recipients='your.email@domain.com',
    @subject='CSV Extract', 
    @body='See attachment',
    @query ='SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable',
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'CSV_Extract.txt',
    @query_result_separator = ',',
    @query_result_header = 1
Run Code Online (Sandbox Code Playgroud)

如果您无论如何都要通过电子邮件将文件发送到某个地方,它可能会为您节省几个步骤。