Во-первых, вы не можете обновить таблицу с 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
.
У Эрланда полезная страница о массовых операциях. Также см. совет Редгейта .