将SQL查询导出为CSV时如何格式化输出

时间:2014-01-15 09:45:39

标签: sql-server powershell csv export-to-csv

我有一项任务是将SQL Server查询的结果保存到.csv文件中。经过一些谷歌搜索后,我决定使用PowerShell。我发现了一个脚本,对它进行了一些修改,它有效,几乎一切都还可以。

$server = "server"
$database = "database"
$query = "SELECT * from et_thanks"

$tod = Get-Date;
$file = "{0:yyyyMMdd}_go.csv" -f $tod;
$extractFile = @"
\\info\export_files\$file
"@

$connectionTemplate = "Data Source={0};Integrated Security=SSPI;Initial Catalog={1};"
$connectionString = [string]::Format($connectionTemplate, $server, $database)
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString

$command = New-Object System.Data.SqlClient.SqlCommand
$command.CommandText = $query
$command.Connection = $connection

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $command
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$connection.Close()

$DataSet.Tables[0] | Export-Csv -Force -Delimiter ";" $extractFile

但我有两个问题是我无法解决的:

  1. 当我打开.csv文件时,我在第一行看到了列标题和注释字符串:

    #TYPE System.Data.DataRow
    "ob_no","c_name","c_visible","c_fp","e_from","e_to"
    "436439","09.09.2013 11:29:08","0","","10937","260153"
    

    我该怎样摆脱它?

  2. 所有值都用引号括起来。是否可以在导出时修改脚本而不使用它? Autoreplace不是一个好主意,因为有可能在sql数据中找到引号。

  3. 我试图在文档中找到答案(http://ss64.com/ps/export-csv.html),但没有成功。

3 个答案:

答案 0 :(得分:3)

你可能会在删除引号时遇到麻烦,但如果这是你真正想要的,那么以下内容应该实现它。

-NoTypeInformation 将删除您看到的其他类型信息。

($DataSet.Tables[0] | ConvertTo-Csv -Delimiter ";" -NoTypeInformation) -replace "`"", "" | `
Out-File -Force $extractFile

这使用convertto-csv转换为csv的字符串表示形式,然后替换所有“没有任何内容,最终字符串被传送到Out-File的实例。”

答案 1 :(得分:1)

...并且,为了摆脱标题记录,如果您首先将数据转换为csv(Convert-Csv),然后将这些结果传递给Select以跳过第一条记录:

($DataSet.Tables[0] | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation ) -Replace "`"","" | Select -skip 1 | Out-File blahblahblah...

答案 2 :(得分:0)

同意export-csv不是这项工作的最佳工具。我会使用sqlcmd.exe或bcp.exe提供的SQL Server命令行工具。您还可以构建一个简单的例程来从数据表创建CSV:

$result = new-Object text.stringbuilder
$dt = $DataSet.Tables[0]

foreach ($dr in $dt.Rows) {
           for ($i = 0; $i -lt $dt.Columns.Count; $i++) {

                $null = $result.Append($($dr[$i]).ToString())
                $null = $result.Append($(if ($i -eq $dt.Columns.Count - 1) {"`n" } else { ","} ))
            }
}

$result.ToString()