我正在尝试使用 Powershell 将数据从 SQL 服务器数据库导出到 CSV 文件。我已经完成了脚本,并且已经过测试,可以正常工作,但只需要进行一点修补。如果没有要导出的数据,我不想创建文件,但目前它会创建文件。
$ConnectionString = "Data Source=SQLInstance; Database=db; Trusted_Connection=True;";
$streamWriter = New-Object System.IO.StreamWriter "\\servername\someFolder\Testing.csv"
$sqlConn = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.Connection = $sqlConn
$sqlCmd.CommandText = "SELECT * FROM db..mytable where updated = 0"
$sqlConn.Open();
$reader = $sqlCmd.ExecuteReader();
$array = @()
for ( $i = 0 ; $i -lt $reader.FieldCount; $i++ )
{ $array += @($i) }
$streamWriter.Write($reader.GetName(0))
for ( $i = 1; $i -lt $reader.FieldCount; $i ++)
{ $streamWriter.Write($("," + $reader.GetName($i))) }
$streamWriter.WriteLine("")
while ($reader.Read())
{
$fieldCount = $reader.GetValues($array);
for ($i = 0; $i -lt $array.Length; $i++)
{
if ($array[$i].ToString().Contains(","))
{
$array[$i] = '"' + $array[$i].ToString() + '"';
}
}
$newRow = [string]::Join(",", $array);
$streamWriter.WriteLine($newRow)
}
$reader.Close();
$sqlConn.Close();
$streamWriter.Close();
我需要在创建文件之前检查是否有数据。请帮帮我,我对 PS 还很陌生。
答案1
您正在使用 PowerShell,大多数情况下无需担心 .NET。
$ConnectionString = "Data Source=SQLInstance; Database=db; Trusted_Connection=True;";
$outfile = @()
$sqlConn = New-Object System.Data.SqlClient.SqlConnection $ConnectionString
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.Connection = $sqlConn
$sqlCmd.CommandText = "SELECT * FROM db..mytable where updated = 0"
$sqlConn.Open();
$reader = $sqlCmd.ExecuteReader();
$array = @()
for ( $i = 0 ; $i -lt $reader.FieldCount; $i++ )
{ $array += @($i) }
$line = $reader.GetName(0)
for ( $i = 1; $i -lt $reader.FieldCount; $i ++)
{ $line += ($("," + $reader.GetName($i))) }
$outfile += $line
while ($reader.Read())
{
$fieldCount = $reader.GetValues($array);
for ($i = 0; $i -lt $array.Length; $i++)
{
if ($array[$i].ToString().Contains(","))
{
$array[$i] = '"' + $array[$i].ToString() + '"';
}
}
$outfile += [string]::Join(",", $array);
}
if ($outfile.Count -gt 0)
{ $outfile | Out-File "\\servername\someFolder\Testing.csv" }
非常简单,不是在每种情况下都直接写入文件(这需要预先创建文件),而是将所有内容保存到数组中$outfile
,然后在最后测试是否添加了任何内容,如果是,则写入文件。