7

我需要做的是使用 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

使用联合,获取数据和它的列标题。

这就是我对 T-SQL 导出为 CSV 的所有理解,请帮我确认。

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

谢谢!

4

5 回答 5

5

在 SQL Server 中执行以下命令:

EXEC xp_cmdshell 'SQLCMD -S . -d MsVehicleReg2 -Q "SELECT * FROM tempViolationInfo" -s "," -o "O:\result.csv"';
于 2013-05-08T14:13:26.447 回答
5

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

SELECT 'object_id', 'name'

UNION ALL

SELECT object_id, name
FROM sys.tables
于 2012-09-24T15:25:43.610 回答
4

这是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 文件的第一行是所有字段的分隔列表。

于 2014-01-22T15:15:16.837 回答
1

关于“最佳实践”,没有最佳实践。有几个选项可用,不限于:

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

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

  • SSIS 包

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

于 2014-02-28T18:47:40.340 回答
1

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

使用 /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 '显示高级选项', 1; 去重新配置;GO sp_configure 'Ad Hoc 分布式查询', 1; 去重新配置;去

于 2014-02-28T18:42:40.693 回答