我有一项任务是将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
但我有两个问题是我无法解决的:
当我打开.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"
我该怎样摆脱它?
所有值都用引号括起来。是否可以在导出时修改脚本而不使用它? Autoreplace不是一个好主意,因为有可能在sql数据中找到引号。
我试图在文档中找到答案(http://ss64.com/ps/export-csv.html),但没有成功。
答案 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()