2

所以我有这个特殊的场景,我需要将来自多个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])')"
  }

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

4

1 回答 1

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
于 2018-05-09T13:04:51.937 回答