Sql BCP根据powershell的输出更新数据库表

Sql BCP根据powershell的输出更新数据库表,sql,powershell,bcp,Sql,Powershell,Bcp,我有4个文件具有与下面相同的csv头 但我只需要第2列、第3列和第4列中的数据,就可以使用BCP将数据导入SQL数据库。我正在使用PowerShell选择我想要的列,并使用BCP导入所需的数据,但我的PowerShell执行时没有错误,并且我的数据库表中没有更新的数据。我想知道如何设置BCP以将输出从Powershell导入数据库表。这是我的powershell脚本 首先,不能使用bcp更新表。它用于批量加载数据。也就是说,它将插入新行或将现有数据导出到平面文件中。更改现有行(通常称为更新)超

我有4个文件具有与下面相同的csv头

但我只需要第2列、第3列和第4列中的数据,就可以使用BCP将数据导入SQL数据库。我正在使用PowerShell选择我想要的列,并使用BCP导入所需的数据,但我的PowerShell执行时没有错误,并且我的数据库表中没有更新的数据。我想知道如何设置BCP以将输出从Powershell导入数据库表。这是我的powershell脚本

首先,不能使用bcp更新表。它用于批量加载数据。也就是说,它将插入新行或将现有数据导出到平面文件中。更改现有行(通常称为更新)超出了bcp的范围。如果这是你需要的,你需要使用另一个工具。Sqlcmd工作正常,Powershell可以运行任意TSQL语句

无论如何,这个函数的语法是出了名的复杂。据我所知,不能通过将数据作为参数传递给bcp来批量加载数据,必须使用源文件。因此,您需要保存过滤后的文件并将其名称传递给bcp

导出过滤后的CSV非常简单,请记住使用-NoTypeInformation开关,以免将TYPE Selected.System.Management.Automation.PSCustomObject作为第一行数据。假设bcp参数是好的,为什么-F2呢?Unix新线呢

剥离双引号需要对文件进行另一次编辑。刺客

根据您的区域设置,列分隔符可以是分号、冒号或其他形式。使用-Delimiter开关传递您需要的任何内容或更改bcp的参数


Erland有大量的业务。另外,请参阅Redgate的。

无需先修改文件,这里有一个关于bcp如何处理引用数据的答案

本质上,您需要使用-f选项并创建/使用一个格式文件来告诉SQL您的自定义字段分隔符简言之,它不再是一个单独的逗号,而是现在,。。。逗号加两个双引号。需要转义dblquotes和一个小技巧来处理一行中的第一个双引号。但它就像一个符咒


另外,需要格式化文件来忽略列。。。只需将目标列编号设置为零。加载前无需修改文件。祝你好运

您的文件显示有一个逗号作为分隔符,但您的BCP命令设置为-t;它告诉bcp分号字符是您的字段分隔符。文件中的实际分隔符是什么?逗号还是分号?最后,您可以使用BCP跳过一列,而不是要求powershell重新创建数据行。你能接受这个答案吗?或者必须在BCP之前使用powershell转换文件?我不会使用脚本语言来处理传入的数据,我只会使用BCP或SSI。为什么不直接使用SSI来实现这一点?我有我的理由,但很好奇你为什么选择不这么做。我对BCP或BCP都不熟悉。那么BCP能够完成这项工作吗?我的原始csv分隔符是逗号。所需的输出是我需要根据csv中的数据更新数据库表列。我的CSV有四列,但我的DB表只有三列,BCP可以完成这项工作。SSI也可以做到这一点。但BCP可能更适合您,因为您似乎更习惯于编写脚本,并且可能希望避免使用gui开发环境解决方案。是否有任何命令可以忽略导出csv中的双引号?@HeartBreakKID为什么?用双引号括起数据是CSV标准的一部分。无论如何,没有内置的功能,所以作为文本进行搜索和替换可能会起作用。您也可以试试运气。因为数据需要使用BCP导入数据库,所以不能接受任何双引号。但无论如何,感谢您的指导,我设法将其更新到数据库表中,但上面有双引号。@HeartBreakKID请参阅关于从文件中删除双引号的编辑。
Column1,Column2,Column3,Column4 
$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>
}
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}
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>
}