我有这个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会怎么样?
如何构建一次更新多条记录的查询?
答案 0 :(得分:2)
这应该很简单
$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]