База данных обновления базы данных BCP на основе результатов powershell - PullRequest
0 голосов
/ 22 октября 2019

У меня есть 4 файла с таким же заголовком csv, как показано ниже

Column1,Column2,Column3,Column4 


Но мне потребовались только данные из Column2,Column3,Column4 для импорта данных в базу данных SQL с использованием BCP. Я использую PowerShell для выбора нужных столбцов и импортирую необходимые данные, используя BCP, но мой powershell выполнен без ошибок, и в моей таблице базы данных не обновлены данные. Могу ли я узнать, как установить BCP для импорта вывода из Powershell в таблицу базы данных. Вот мой скрипт powershell

$filePath = Get-ChildItem -Path 'D:\test\*' -Include $filename
$desiredColumn = 'Column2','Column3','Column4'

foreach($file in $filePath)
{
  write-host $file
 $test = import-csv $file | select $desiredColumn
 write-host $test
 $action = bcp <myDatabaseTableName> in $test -T -c -t";" -r"\n" -F2 -S <MyDatabase>
}



Это выходные данные скрипта powershell

D:\test\sample1.csv
@{column2=111;column3=222;column4=333} @{column2=444;column3=555;column4=666}
D:\test\sample2.csv
@{column2=777;column3=888;column4=999} @{column2=aaa;column3=bbb;column4=ccc}

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Без необходимости сначала изменять файл, здесь есть ответ о том, как bcp может обрабатывать данные в кавычках.

BCP с полями в кавычках в исходном файле

По сути, вам нужно использовать опцию -f и создать / использовать файл формата, чтобы сообщить SQL свой разделитель настраиваемого поля (короче говоря, он больше не является запятой (,), но теперь это (",") ... запятая с двумя двойными кавычками. Нужно избегать dblquotes и небольшого трюка для обработки первой цитаты doulbe в строке. Но она работает как шарм.

Кроме того, нужен файл формата, чтобы игнорировать столбец (столбцы)... просто установите номер столбца назначения равным нулю. Все без необходимости изменять файл перед загрузкой. Удачи!

0 голосов
/ 22 октября 2019

Во-первых, вы не можете обновить таблицу с bcp. Он используется для массовой загрузки данных. Таким образом, он либо вставит новых строк, либо экспортирует существующих данных в плоский файл. Изменение существующих строк, обычно называемых обновлением, выходит за рамки bcp. Если это то, что вам нужно, вам нужно использовать другой инструмент. Sqlcmd отлично работает, и у Powershell есть Invoke-Sqlcmd для выполнения произвольных операторов TSQL.

В любом случае, утилита BCP имеет заведомо хитрый синтаксис. Насколько я знаю, нельзя выполнить массовую загрузку данных, передав данные в качестве параметра bcp, необходимо использовать исходный файл. Таким образом, вам нужно сохранить отфильтрованный файл и передать его имя в bcp.

Экспорт отфильтрованного CSV достаточно прост, просто не забудьте использовать переключатель -NoTypeInformation, чтобы вы не получили #TYPE Selected.System.Management.Automation.PSCustomObject в качестве вашегопервый ряд данных. Предполагая, что аргументы bcp хороши и хороши (почему -F2 хотя? И новые строки Unix?).

Удаление двойных кавычек требует еще одного редактирования файла. У Scrpting Guy есть решение .

foreach($file in $filePath){
  write-host $file
  $test = import-csv $file | select $desiredColumn
  # Overwrite filtereddata.csv, should one exist, with filtered data
  $test | export-csv -path .\filtereddata.csv -NoTypeInformation
  # Remove doulbe quotes
  (gc filtereddata.csv) | % {$_ -replace '"', ''} | out-file filtereddata.csv -Fo -En ascii
  $action = bcp <myDatabaseTableName> in filtereddata.csv -T -c -t";" -r"\n" -F2 -S <MyDatabase>
}

В зависимости от вашей локали, разделитель столбцов может быть точкой с запятой, двоеточием или чем-то еще. Используйте переключатель -Delimiter '<character>', чтобы передать все, что вам нужно, или измените аргумент bcp.

У Эрланда полезная страница о массовых операциях. Также см. совет Редгейта .

...