在单个SQL Server查询中更新多行 - 在VBA中

时间:2016-06-30 13:04:22

标签: sql sql-server vba sql-update

我正在使用VBA使用以下代码更新Access数据库:

For i = 1 To imax
    strSql = "UPDATE Products SET Price ='" & vArray(i, 2) & "' WHERE ID = '" &   vArray(i, 1) & "';"
    connDB.Execute (strSql)
Next i

虽然有效,但可能非常慢,因为需要更新5,000到10,000行(imax)。

有没有办法使用单个SQL语句?

我在下面尝试过Jatin的建议。不幸的是,它不会飞到我这边(尝试下面的前三行):

UPDATE p SET p.Price = x.SetValue FROM Products p INNER JOIN (
SELECT '149' AS SetValue, 'P100005' AS WhereValue  UNION ALL 
SELECT '129' AS SetValue, 'P100001' AS WhereValue  UNION ALL 
SELECT '99' AS SetValue, 'P100002' AS WhereValue  ) AS x ON p.ID = x.WhereValue;

2 个答案:

答案 0 :(得分:0)

对不起,但是没有这样的声明。在这种情况下你必须这样做。

答案 1 :(得分:0)

我不是VBA的专家,但下面的内容将完成任务。

strValues = "INNER JOIN (VALUES "
For i = 1 To imax    
    strValues = strValues & IIF(i = 1,"",",") & "('" & vArray(i, 2) & "', '" & vArray(i, 1) & "')"
Next i
strValues = strValues & " ) AS x(SetValue, WhereValue) ON p.ID = x.WhereValue "
strSql = "UPDATE p SET p.Price = x.SetValue FROM Products p " & strValues
connDB.Execute (strSql)
下面的

是另一种解决方案,它使用UNION ALL构建值表。

strValues = "INNER JOIN ("
For i = 1 To imax    
    strValues = strValues & vbCrLf & "SELECT '" & vArray(i, 2) & "' AS SetValue, '" & vArray(i, 1) & "' AS WhereValue " & IIF(i = imax,""," UNION ALL ") 'skip Union All for last entry
Next i
strValues = strValues & " ) AS x ON p.ID = x.WhereValue "
strSql = "UPDATE p SET p.Price = x.SetValue FROM Products p " & strValues
connDB.Execute (strSql)