将SQL Server查询结果导出为CSV并处理嵌入式换行符,引号,逗号等

时间:2018-10-23 04:01:04

标签: sql-server csv bcp

我正在使用bcp将数据从SQL查询导出到CSV文件,但是包含嵌入换行符,逗号,引号等的字段出现问题。

我有一个包含两列IdName的表。

我的bcp命令如下:

bcp "select Id, Name from MyTable" queryout ./results.csv -c -t, -U SA -S localhost

生成的CSV文件如下所示:

1,Quick brown fox
2,The quick brown fox
jumps over the
lazy dog
3,This is a "quoted" value
4,Quick, Brown, Fox

有没有一种方法可以让bcp自动引用字段,转义任何现有的引用等,以便生成的CSV文件实际上有效?

理想情况下,我希望csv文件看起来像这样:

"1","Quick brown fox"
"2","The quick brown fox
jumps over the
lazy dog"
"3","This is a \"quoted\" value"
"4","Quick, Brown, Fox"

2 个答案:

答案 0 :(得分:0)

通常我在powershell中使用-replace格式化BCP的输出,如下所示,

    [string]$rowStart=[System.Guid][System.Guid]::NewGuid()
    [string]$fieldTerm=[System.Guid][System.Guid]::NewGuid()
    [string]$rowTerm=[System.Guid][System.Guid]::NewGuid()

    bcp "select format(Id, '$rowStart#'), Name from Test.dbo.MyTable" queryout "C:\temp\yourfile.txt" -c -T -t"$fieldTerm" -r"$rowTerm" -S"localhost"

    $rowEndTerm='"' + $rowTerm

    cat "C:\temp\yourfile.txt" `
    | ForEach-Object { $_ -replace '"', '\"'  } `
    | ForEach-Object { $_  -replace $rowStart, '"'} `
    | ForEach-Object { $_ -replace $fieldTerm, '","'} `
    | ForEach-Object { $_ -replace "$rowTerm", $rowEndTerm} `
    | ForEach-Object { $_ -replace $rowTerm, "`r`n"} `
    > "C:\temp\results.csv"

答案 1 :(得分:0)

答案部分。

  1. 要引用字段,您需要使用格式文件来指定自定义字段终止符。 SO上已经有很多答案可以解决这个问题。

  2. 对于您数据中的crlfs ...看来BCP做了您想要的事情。它将它们打印出来,因为它们在数据中。听起来您想要清除的是那些数据,即使它们已包含在源表中。只需在查询中使用“替换”功能即可处理。摆脱“选择*”,并用所需列的完整选择替换,并在“名称”列上使用“替换”。