我需要在T-SQL中将最佳实践导出数据到CSV(带标题)

时间:2012-09-24 14:45:40

标签: sql tsql csv sqlcmd sql-agent-job

我需要做的是使用T-SQL将数据导出到CSV文件中。

我很困惑,有很多方法可以做到,我不知道选择哪一个,请帮我确认一下:

据我所知,大约有3种方法,我希望你帮我确认一下:

使用Microsoft.Jet.OLEDB.4.0,如下所示:

INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                       'Text;Database=C:\Temp\;HDR=Yes;',
                       'SELECT * FROM test.csv')
            (object_id, name)
SELECT object_id, name
  FROM sys.tables;

但这需要csv文件,并带有标题

使用SQLCMD

命令行。

使用BCP

使用union,获取数据及其列标题。

这是我对T-SQL导出到CSV的全部理解,请帮我确认一下。

还有其他方法可以导出到CSV吗?

谢谢!

5 个答案:

答案 0 :(得分:4)

您可以使用UNION创建标题行,如下所示:

SELECT 'object_id', 'name'

UNION ALL

SELECT object_id, name
FROM sys.tables

答案 1 :(得分:4)

在SQL Server中执行以下命令:

EXEC xp_cmdshell 'SQLCMD -S . -d MsVehicleReg2 -Q "SELECT * FROM tempViolationInfo" -s "," -o "O:\result.csv"';

答案 2 :(得分:1)

以下是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

但是,有几点需要注意:

  1. 您需要提供Microsoft.ACE.OLEDB.12.0提供程序。 Jet 4.0提供程序也可以使用,但它很古老,所以我使用了这个。

  2. .CSV文件必须已经存在。如果您正在使用标题(HDR = YES),请确保.CSV文件的第一行是所有字段的分隔列表。

答案 3 :(得分:1)

对于Ace.OLEDB.12.0(新的Jet可再发行引擎),您可以安装32位或64位独立引擎,即使您已经安装了“其他风格”,无论是否独立,来自Access等:

使用/ passive命令行选项:

(32位):AccessDatabaseEngine.exe / passive (64位):AccessDatabaseEngine_64.exe / passive

在我的情况下,我有64位SQL Express 2008 R2,并安装了32位Office 12应用程序(因此,安装了32位ACE驱动程序)。我安装了64位AccessDatabaseEngine_64.exe,它现在对我有用......

此外,假设您已完成其他配置工作:

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess',1 GO

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters',1 GO

sp_configure'show advanced options',1; 走 RECONFIGURE; 走 sp_configure'Ad Hoc Distributed Queries',1; 走 RECONFIGURE; GO

答案 4 :(得分:1)

关于“最佳实践”,没有最佳实践。 有几种选择,不限于:

  • 在T-SQL中使用INSERT INTO OPENROWSET(...)SELECT *来自[MyTable] ......

  • 执行BCP,无论是从作业步骤还是在使用xp_cmdshell的T-SQL

  • SSIS包

  • PowerShell(来自作业步骤,SQL Server 2008+)或其他外部脚本/可执行文件