用于构建插入查询的foreach with do

时间:2015-07-24 14:50:53

标签: 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会怎么样?

如何构建一次更新多条记录的查询?

2 个答案:

答案 0 :(得分:2)

这应该很简单

  1. 将所有语句分配给字符串数组(这里的foreach循环完全合适)
  2. 将字符串数组拆分为多个1000或更少的字符串数组
  3. 连接每个组
  4. 执行查询
  5. $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
    }
    

答案 1 :(得分:1)

取决于某些因素,您可以使用bulk insert代替多次插入。

要满足的要求是2:
- 要导入的文件必须在sql server上 - 对于要导入的文件格式,CSV文件必须符合msdn中规定的特定要求

如果您能够遵守上述要求,您可以使用简单的语句导入整个文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^pdf/PA%20article%20-%20Cross%20Selling\.pdf$ /wp-content/uploads/2014/12/PA_article_-_Cross_Selling.pdf?&%{QUERY_STRING} [B,r=301,nc]