Я пытаюсь экспортировать данные из базы данных сервера SQL в файл CSV с помощью Powershell. У меня уже есть скрипт, он был протестирован и работает, но мне нужно сделать небольшой патч. Если нет данных для экспорта, я не хочу, чтобы файл создавался, но в настоящее время он создает файл.

$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 ответ1

0

Вы используете 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 затем в конце проверить, добавлено ли что-нибудь и, если да, записать в файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .