sql - foreach 和 do while 用于构建插入查询

标签 sql powershell

我有这个 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 怎么办?

我怎样才能构建一次更新多条记录的查询?

最佳答案

这应该相当简单

  1. 将所有语句分配给一个字符串数组(您的 foreach 循环在这里完全合适)
  2. 将字符串数组拆分为多个1000个或更少的字符串数组
  3. 连接每个组
  4. 执行查询

$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/

相关文章:

c# - 如何从 System.IO.File 调用访问 PSDrive?

powershell - 是否可以为单个存储库禁用 posh-git?

powershell - New-AzureDeployment 包上传超时

mysql 正则表达式查询挂起,但在 mysql 进程重新启动时显示结果

mysql - 在 SQL 中组合条目

php - Google App Engine Cloud SQL 上的 SQL 语法错误

mysql - 将数字替换为单词并显示

php - 带复选框的简单 php mysql 搜索引擎

azure - PowerShell 版本及其管理 Azure Active Directory 的能力有何区别?

Powershell - 使用模块编译