我有以下一组示例代码:
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中实现这一目标?
答案 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的数据表),并使用bulkcopy(example here)。 如果您不在SQL Server上,则默认情况下可以使用导入文件工具或sqlcommand。