【问题标题】:Insert data row wise in a SQL Table from a CSV using PowerShell使用 PowerShell 在 CSV 中的 SQL 表中逐行插入数据
【发布时间】:2018-10-19 12:04:34
【问题描述】:

所以我有这种特殊情况,我需要将来自多个CSV 文件的数据插入到多个SQL tables 中。我遇到过this SO link,它逐行插入数据。以下是链接中的代码-sn-p -

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

我面临的问题是,我有多个CSVs,其中的列数不同。所以硬编码 code-sn-p 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])')"
  }

但它似乎不起作用。我已经为此苦苦挣扎了很长一段时间并且没有想法。一双新鲜的眼睛将不胜感激。

【问题讨论】:

  • @LotPings 的解决方案效果很好。但正如他所说,如果记录中有',它可能会失败,这可能出现在FirstNameLastName 等列中。任何寻找替代解决方案的人都可以参考this 答案。与我的问题无关,但仍然是从CSVsSQL tables 插入数据的好方法。

标签: powershell csv invoke-sqlcmd


【解决方案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-ed,您可以使用

$CSV.Psobject.Properties.Name

【讨论】:

  • 确实不错。完美运行! :)
  • 它省去了很多处理未知列数的麻烦。如果列数据中有任何',它可能会失败。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 2015-06-14
相关资源
最近更新 更多