Вставить строку данных в таблицу SQL из CSV с помощью PowerShell

Так что у меня есть этот конкретный сценарий, где мне нужно вставить данные из нескольких CSV файлы в несколько SQL tables, Я наткнулся на эту ссылку SO, которая вставляет данные построчно. Ниже приведен фрагмент кода по ссылке -

Import-CSV .\yourcsv.csv | ForEach-Object {Invoke-Sqlcmd `
  -Database $database -ServerInstance $server `
  -Query "insert into $table VALUES ('$($_.Column1)','$($_.Column2)')"
  }

Проблема, с которой я сталкиваюсь, у меня есть несколько CSVs с разным количеством столбцов в них. Таким образом, возможность жесткого кодирования фрагмента кода VALUES('$($_.Column1)','$($_.Column2)') не существует

Кроме того, есть таблицы, которые содержат более 100 столбцов. Итак, написание VALUES('$($_.Column1)','$($_.Column2)')... so on upto '$($_.Column100)' тоже не осуществимо.

То, что я сделал для того же, хранится имена столбцов из CSVs в массив PowerShell, как это -

$File = "C:\Users\vivek.singh\Desktop\ALL_EMAILS.csv"
$csvColumnNames = (Get-Content $File | Select-Object -First 1).Split(",")

Сейчас $csvColumnNames, имеет все имена столбцов для ALL_EMAILS Таблица. Я пытаюсь вписать это в решение -

Import-CSV .\yourcsv.csv | ForEach-Object {Invoke-Sqlcmd `
  -Database $database -ServerInstance $server `
  -Query "insert into $table VALUES ('$($csvColumnNames[0])','$($csvColumnNames[1])',..'$($csvColumnNames[$csvColumnNames.Length])')"
  }

Но это не похоже на работу. Я боролся с этим в течение достаточно долгого времени и исчерпал идеи. Свежая пара глаз будет с благодарностью.

1 ответ

Решение

Попробуй это

Import-CSV .\yourcsv.csv | ForEach-Object {
    $AllValues = "'"+($_.Psobject.Properties.Value -join "','")+"'"
    Invoke-Sqlcmd -Database $database -ServerInstance $server `
    -Query "insert into $table VALUES ($AllValues)"
}

Он использует оператор -join для объединения всех значений текущей строки (с начальным и конечным ' построить $AllValuesпеременная, которая затем может быть вставлена ​​в команду sql.

Вы должны проверить, соответствуют ли заголовки Csv именам столбцов sql.

Чтобы получить имена столбцов один раз Import-CsvВы можете использовать

$CSV.Psobject.Properties.Name
Другие вопросы по тегам