Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要T-SQL将数据导出到CSV(带标题)的最佳实践_Sql_Tsql_Csv_Sqlcmd_Sql Agent Job - Fatal编程技术网

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

我需要T-SQL将数据导出到CSV(带标题)的最佳实践,sql,tsql,csv,sqlcmd,sql-agent-job,Sql,Tsql,Csv,Sqlcmd,Sql Agent Job,我需要做的是使用T-SQL将数据导出到CSV文件。 我很困惑有很多方法可以做到这一点,我不知道选择哪一种,请帮我确认以下问题: 据我所知,大约有3种方法,我希望您帮助我确认: 使用Microsoft.Jet.OLEDB.4.0,如下所示: 但这需要csv文件在那里,并且带有标题 使用SQLCMD 命令行 使用BCP 使用union,获取数据及其列标题 这是我对T-SQL导出到CSV的所有理解,请帮助我确认 是否有其他方式导出到CSV 谢谢 可以使用联合创建标题行,如下所示: SELECT 'ob

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

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

据我所知,大约有3种方法,我希望您帮助我确认:

使用Microsoft.Jet.OLEDB.4.0,如下所示: 但这需要csv文件在那里,并且带有标题

使用SQLCMD 命令行

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

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

是否有其他方式导出到CSV


谢谢

可以使用联合创建标题行,如下所示:

SELECT 'object_id', 'name'

UNION ALL

SELECT object_id, name
FROM sys.tables

在SQL Server中执行以下命令:

EXEC xp_cmdshell 'SQLCMD -S . -d MsVehicleReg2 -Q "SELECT * FROM tempViolationInfo" -s "," -o "O:\result.csv"';
以下是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
但是,有几个警告:

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

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

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

    使用/被动命令行选项:

    (32位):AccessDatabaseEngine.exe/被动 (64位):AccessDatabaseEngine_64.exe/被动

    在我的例子中,我安装了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 去

    EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.oledb.12.0', N'DynamicParameters',1 去

    sp_配置“显示高级选项”,1; 去 重新配置; 去 sp_配置“临时分布式查询”,1; 去 重新配置; 关于“最佳实践”,没有最佳实践。 有几个选项可用,但不限于:

    • 在带有INSERT INTO OPENROWSET(…)的T-SQL中,从[MyTable]中选择*

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

    • SSIS包

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


    向我们展示CSV文件的外观。抱歉,事实上,我想要一个将数据导出到CSV的最佳实践。最佳实践是主观的。使用适合你的方法。如果您想要“最正式”的解决方案,那将是使用SSIS包,并将其与SQL Server代理作业一起计划。感谢您的回复,使用bcp和union可以导出到带有标题的csv。谢谢事实上,我们正在从DTS/SSIS中移出…欢迎来到堆栈溢出!我想你应该解释一下这个命令的作用。如果你详细说明你建议的每一个命令,这将是非常有用的;但您不必这样做。找不到存储过程“xp\u cmdshell”?
    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