在Powershell中以块的形式处理sql更新

时间:2018-01-19 22:08:38

标签: powershell powershell-v2.0 powershell-v3.0 powershell-v4.0

我有以下一组示例代码:

foreach($status in $SomeStatus)
        {
            Invoke-Expression("Invoke-SqlCmd -S . -query " + @"
            " Update [DocStatus]
              SET LastModifiedAt = 'something'
              WHERE 
                  DocId='$($status.DocId)'"
"@)
        }

但是,如果我要更新100000条记录,这太慢了。

我想做(例如):

 Do updates in chunks of 1000

    foreach(chunk)
    {
    open file 

    foreach(record in chunk) {
    write to file
    }
    sql-exec(file)
    close file
    }

有谁能告诉我如何在PowerShell中实现这一目标?

2 个答案:

答案 0 :(得分:0)

您实际上是通过PowerShell执行游标,而PowerShell并没有利用SQL效率。我建议您编写要更新到文件的值(powershell非常快速地执行此操作),执行从平面文件导入到数据库(100k记录不是太大)到临时表,然后执行一个处理所有的更新语句一次性记录。这样你就不会调用SQL 100k次,只需要两次。

修改 以下是使用循环收集数据并将其保存为CSV文件的示例:

Output PowerShell variables to a text file

此网站(众多网站之一)详细介绍了如何使用powershell创建临时表并将数据导入其中:

https://gallery.technet.microsoft.com/scriptcenter/Import-Large-CSVs-into-SQL-216223d9

最后,您可以使用自己的invoke-expression命令而不使用任何PowerShell变量,甚至可以在数据库中保留一个可以通过PowerShell执行的proc。

答案 1 :(得分:0)

你的方法错了。

  1. 将您的数据导入数据库,在tabletemporary1中通过示例
  2. 导入
  3. 只需在桌面DocStatus
  4. 上使用tabletemporary1加入一次更新

    对于1.您可以循环访问您的文件并写入数据表(具有相同结构的tabletemporary1的数据表),并使用bulkcopy(example here)。 如果您不在SQL Server上,则默认情况下可以使用导入文件工具或sqlcommand。