【发布时间】:2023-01-10 02:25:40
【问题描述】:
我正在尝试通过在 Microsoft sql server 中使用 bcp 命令导出 csv 文件中的表。
下面是表格示例数据
Table name : XYZ
col1 col2 col3
abcd,inc. USD,inc 1234
pqrs,inc USD,inc 6789
stuv,inc USD,inc 0009
如上所述,列值中有逗号。
我写了如下的 .fmt 文件:
test.fmt
13.0
3
1 SQLCHAR 0 4000 "\",\"" 1 col1 SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 4000 "\",\"" 2 col2 SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 4000 "\r\n" 3 col3 SQL_Latin1_General_CP1_CI_AS
以下是我正在使用的命令:
DECLARE
@V_BCP_QUERY VARCHAR(4000),
@V_BCP_OUTPUT_FILE VARCHAR(1500),
@V_BCP_FORMAT_FILE VARCHAR(1500),
@V_BCP_COMMAND VARCHAR(4000)
begin
SET @V_BCP_QUERY='"SELECT col1,col2,col3 FROM TABS..XYZ"'
SET @V_BCP_OUTPUT_FILE='"D:\OUTPUT.csv"'
SET @V_BCP_FORMAT_FILE='"D:\test.fmt"'
SET @V_BCP_COMMAND='bcp '+@V_BCP_QUERY+' queryout '+@V_BCP_OUTPUT_FILE+' -f '+@V_BCP_FORMAT_FILE+' -T -S "DEV-CR"'
EXECUTE Master.dbo.xp_CmdShell @V_BCP_COMMAND
end
我在 OUTPUT.csv 文件中得到以下数据:
abcd,inc.","USD,inc","1234
pqrs,inc","USD,inc","6789
stuv,inc","USD,inc","0009
行首和行尾没有 "。 另外,当我在 excel 中打开它时,所有行都在一行中
我的要求是将文件导出到 csv 文件中。
请帮助
【问题讨论】:
-
这是预期的,您将分隔符定义为
",",并且分隔符不会出现在每行的开头或结尾。bcp不支持文本标识符,因此您最好使用支持的工具,或者使用数据中未出现的分隔符。例如,管道 (|) 可能是更好的选择。 -
在我看来,您使用
xp_cmdshell调用bcp然后调用 SQL Server 的事实更加“hacky”。使用实际的 ETL 工具,而不是您正在使用的方法。 -
我需要在存储过程中添加这段代码 sn-p
-
不要使用 bcp 实用程序。它不支持包含引号、逗号或换行符的分隔文件数据,尽管 RFC4180 已经存在 17 年了。如果您需要导出包含嵌入式引号、逗号或换行符的数据,请考虑使用外部工具,例如 PowerShell 的
Export-Csvcmdlet。 -
听起来绝对像是一个 ETL 工具的案例,它可以上传数据,调用一个过程来生成所需格式的数据,然后使用该数据和出口它。 T-SQL 是这种端到端解决方案的错误工具。例如,作为 SQL Server 一部分的 SSIS 可以很容易地实现这一点。您可以使用数据流任务进行导入,然后使用另一个任务进行导出,其中导出使用生成数据集作为数据源的过程。
标签: sql-server csv bcp