我在Access中有一个非常简单的UPDATE查询,该查询应该更新基础SQL Server。无论出于何种原因,Access都不会将查询传递给服务器,而是由它自己处理,即,它对每一行进行更新查询。由于表很大,因此它将永远运行。
这是由编辑器生成的查询。
UPDATE dbo_myTable
SET dbo_myTable.myColumn = 'A'
WHERE dbo_myTable.myOtherColumn = 123;
如果我运行与纯SQL相同的查询,则只需要几秒钟-如预期的那样。
UPDATE dbo.myTable
SET dbo.myTable.myColumn = 'A'
WHERE dbo.myTable.myOtherColumn = 123;
问题不是'A'
值。如果我将其从'A'
更改为Null
,问题仍然存在。
我的实际更新查询更加复杂,涉及联接和多个条件。在调试速度问题时,我可以将其分解为上面已经很慢的上述简单查询。
我使用SQL Server Profiler来确认我的猜测,即访问将对每一行进行查询,而不是将整个查询传递给SQL Server。
不久前,我有一个类似的问题:Force MS Access to send full query to SQL server。尽管问题是相同的-访问没有传递整个查询-解决方案必须有所不同,因为这里实际上没有任何特殊命令。
答案 0 :(得分:3)
Access中更新查询的语法与SQL Server的语法有很大不同,尤其是在连接方面。它们无法移交给SQL Server。
主要区别之一在于,在Access中,更新查询写操作默认情况下锁定所有包含的表并可以写入所有表,而在SQL Server中,您有一个单独的FROM
部分,并且查询只写锁并写入单个表。
如果性能存在问题,请使用直通查询在SQL Server上执行更新查询。
答案 1 :(得分:1)
也许您可以欺骗Access来调用批量更新:
Sql = "UPDATE dbo.myTable SET dbo.myTable.myColumn = 'A' WHERE dbo.myTable.myOtherColumn = 123;"
CurrentDb.Execute Sql, dbQSPTBulk
上面的dbqQSPTBulk应该与dbQSQLPassthough一起使用 但不必。
如果在上面使用,则仅发送一个更新命令。
信用:阿尔伯特·卡洛尔