我有这个 PowerShell 脚本
$CSV = Import-Csv "records.csv"
Foreach ($Row in $CSV) {
$Q = "INSERT INTO database..table([id], [FirstName], [LastName]) VALUES ('"+ ($Row.'id') + "','" + ($Row.'First Name') + "','" + ($Row.'Last Name') + "')"
Invoke-QsSqlQuery -query $Q -SQLServer <servername> -database <databaseName>
}
注意:Invoke-QsSqlQuery
是我自己的函数。
我的问题是我正在为每一行调用一个 SQL 命令。这造成了性能问题。
我想构建 $Q
使其有 1000 行,然后将其调用到 SQL 服务器中。批量是不可能的,因为对于批量,文件需要在服务器上本地复制,而这是不允许的。
通过 do while
我可以数到 1000,这并不难,但如果我的剩余记录少于 1000 怎么办?
我怎样才能构建一次更新多条记录的查询?
最佳答案
这应该相当简单
- 将所有语句分配给一个字符串数组(您的 foreach 循环在这里完全合适)
- 将字符串数组拆分为多个1000个或更少的字符串数组
- 连接每个组
- 执行查询
$CSV = Import-Csv "records.csv"
$SQLServer = "dbserver.corp.company.tld"
$SQLDatabase = "database"
# Set up a string format template
$InsertTemplate = "INSERT INTO database..table([id], [FirstName], [LastName]) VALUES ('{0}','{1}','{2}')"
# Generate all insert statements and store in string array
$AllInserts = foreach($Row in $CSV){
$InsertTemplate -f $Row.id,$Row.'First Name',$Row.'Last Name'
}
# Split array into an array of 1000 (or fewer) string arrays
$RowArrays = for($i=0; $i -lt $AllInserts.Length; $i+=1000){
,@($AllInserts[$i..($i+999)])
}
# Foreach array of 1000 (or less) insert statements, concatenate them with a new line and invoke it
foreach($RowArray in $RowArrays){
$Query = $RowArray -join [System.Environment]::NewLine
Invoke-QsSqlQuery -query $Query -SQLServer $SQLServer -database $SQLDatabase
}
关于sql - foreach 和 do while 用于构建插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31613610/