通过Powershell脚本异步导入大量的.CSV文件到远程MSSQL数据库

时间:2014-02-22 13:01:18

标签: sql sql-server powershell csv

我正在尝试将存储在.csv文件中的大量数据上传到远程MSSQL。

我找到了工作解决方案(至少对于同步模式)here

我正试图通过Powershell工作开始使用asyncronous模式,但它失败了。

这是代码:

Get-ChildItem "G:\Data\*.csv" | % {

Start-job -Name "$($_)" -InitializationScript  {Ipmo Functions -Force -DisableNameChecking} `
-ScriptBlock { $DataImport = Import-Csv -Path $args[0]
               $DataTable = Out-DataTable -InputObject $DataImport
               Write-DataTable -ServerInstance "MSSQL" `
                              -Database "database" `
                             -TableName "table" `
                                -Username "user" `
                              -Password "pwd" `
                              -Data $DataTable
 } -ArgumentList $_.fullname}

我收到错误:

Ipmo:未加载指定的模块“Functions”,因为在任何模块目录中都找不到有效的模块文件。 在行:1个字符:1 + Ipmo函数-Force -DisableNameChecking + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo:ResourceUnavailable :( Functions:String)[Import-Module],FileNotFoundException     + FullyQualifiedErrorId:Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

以这种方式使用Start-Job处理这些文件而不限制您正在创建的作业数可能不是很高效。也就是说,如果有1000个CSV文件,那么您将创建1000个作业。如果您使用的是PowerShell V3或更高版本,则可以尝试工作流来获得更“管理”的并行执行:

workflow Process-CsvFile([string[]]$Files) {
    InlineScript { Import-Module Functions -DisableNameCheck }
    foreach -parallel($file in $Files) {
        InlineScript {
            $DataImport = Import-Csv -Path $args[0]
            $DataTable = Out-DataTable -InputObject $DataImport
            Write-DataTable -ServerInstance "MSSQL" `
                            -Database "database" `
                            -TableName "table" `
                            -Username "user" `
                            -Password "pwd" `
                            -Data $DataTable
        } 
    }
}

$files = Get-ChildItem G:\Data\*.csv| Foreach FullName
Process-CsvFile $files

关于导入函数时出错的问题。需要将Out-DataTableWrite-DataTable函数复制到名为Functions.psm1的文件中,并将该文件放在两个位置之一 - $home\Documents\WindowsPowerShell\Modules\Functions\Functions.psm1$pshome\Modules\Functions\Functions.psm1。我建议把它放在你家里的第一个位置。将文件放在适当的位置后,打开PowerShell并执行ipmo Functions -DisableNameChecking以验证您没有错误。

如果您不想并行执行,则需要修改使用Start-Job的方式,因为这些作业并行运行。创建单个作业以在后台顺序运行CSV文件,例如:

$files = Get-ChildItem G:\Data\*.csv| Foreach FullName
Start-job -Name ProcessCsvFiles`
          -InitializationScript  {Ipmo Functions -Force -DisableNameChecking} `
          -ScriptBlock {param($files) 
               foreach ($file in $files) {
                   $DataImport = Import-Csv -Path $file
                   $DataTable = Out-DataTable -InputObject $DataImport
                   Write-DataTable -ServerInstance "MSSQL" `
                                   -Database "database" `
                                   -TableName "table" `
                                   -Username "user" `
                                   -Password "pwd" `
                                   -Data $DataTable
               }
           } -ArgumentList $files