【发布时间】:2020-08-03 14:11:46
【问题描述】:
我有一堆文件共享,上面有数百万个文件/文件夹。我正在使用gci -Recurse 获取共享上的目录/文件的完整列表,并且我需要将该 gci 中的几条信息加载到 SQL 服务器中以进行额外分析。我用来获取数据的命令是:
gci $SharePath -Recurse | select FullName, Attributes, Length, CreationTimeUtc, LastAccessTimeUtc, LasWriteTimeUtc
现在我可以按照Microsoft's Write-SqlTableData documentation page 上的选项 3 中的建议,使用推荐的语法将其通过管道传输到 Write-SQLTableData,以强制批量插入,如下所示:
$Params = @{
ServerInstance = 'sqlservername'
DatabaseName = 'databasename'
SchemaName = 'dbo'
}
,(gci $SharePath -Recurse | select FullName, Attributes, Length, CreationTimeUtc, LastAccessTimeUtc, LasWriteTimeUtc) | Write-SqlTableData @Params -TableName 'Table1'
然而,这样做的结果是 gci 需要几个小时才能完成,而没有任何反馈,并且在最终将所有数据转储到 SQL 之前,会耗尽许多 GB 的内存并让我的机器慢下来。如果我不使用 ,( 和匹配的 ),数据会在生成时移至 SQL,但是 SQL 服务器会被数百万个单独的插入操作。
我正在寻找的是使用管道的中间答案。我知道我可以将 gci 结果存储在变量 $gciresults 中,然后使用 $gciresults[0..999] 一次将 1000 行传递给 SQL 等等,但我正在尝试利用管道,所以我不会占用太多内存.理想情况下,我会调用一些 cmdlet batching-cmdlet,它允许我将传入的数据拆分成小块,而无需先将其全部存储在内存中,如下所示:
gci ... | select FullName, ... | batching-cmdlet -batchsize 1000 | Write-SqlTableData @Params -TableName 'Table1'
对此类 cmdlet 的搜索不成功。有没有人想过我可以如何做到这一点?
【问题讨论】:
标签: powershell tsql chunking batching