【问题标题】:How to export a SQL table to a CSV file automatically in a query?如何在查询中自动将 SQL 表导出到 CSV 文件?
【发布时间】:2019-04-29 09:16:01
【问题描述】:

我想在查询中自动将 SQL 表导出到 CSV 文件。我已经完成了将 SQL 表导出到 .CSV 但输出是 TAB 分隔的文件并且没有列标题。 如何使输出逗号分隔并带有列标题?

请参阅下面的有效查询,但没有逗号分隔符和列标题。


DECLARE @cmd NVARCHAR(4000)
DECLARE @pathAndFileName NVARCHAR(MAX)
DECLARE @result INT
SET @pathAndFileName = 'C:\test.csv'
SET @cmd = 'bcp " SELECT * from  testdb.dbo.test_table " queryout "'
  + @pathAndFileName + '" -w -T -t -S Servername\SQLExpress; '       
EXEC @result = xp_cmdshell @cmd 
SELECT @result

【问题讨论】:

  • -t, 用于逗号分隔符,-t 只选择默认值,即制表符分隔
  • 可能还值得注意的是,BCP 没有导出列标题的选项,但是有很多技巧可以做到这一点,通常涉及在查询中添加 UNION,并且对值进行硬编码,或者从sys.columns 等中提取它们。

标签: sql-server tsql bcp


【解决方案1】:

使用-t时需要指定字段终止符(默认为制表符(\t)。由于没有指定,所以使用默认值:

SET @cmd = 'bcp " SELECT * from  testdb.dbo.test_table " queryout "'
         + @pathAndFileName + '" -w -T -t "," -S Servername\SQLExpress; ';

但是,请注意,我强烈建议不要连接 @pathAndFileName 的原始值,尤其是当它是 nvarchar(MAX) 时。你在那里的东西很容易被注入。

如果@pathAndFileName 的值总是小于或等于128 个字符,那么我将@pathAndFileName 声明为系统名称,然后使用...+ QUOTENAME(@pathAndFileName,'"') + ...。如果它可能超过 128 个字符,那么您需要自己引用它:

... + REPLACE(@pathAndFileName,'"','""') + ...

【讨论】:

  • 谢谢!这有很大帮助。不过只有列标题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2010-10-22
  • 2015-05-25
  • 1970-01-01
相关资源
最近更新 更多