使用 SQL Server/ADO 的 Index + Seek on Access/DAO 的替代方案



我正在将Excel应用程序从本地MS Access后端(使用DAO)转换为在Azure上运行的SQL Server(使用ADO)。

我使用 DAO 执行的一项常见任务是 index + seek 方法来扫描大量输入行(~10,000,并使用多字段索引),检查数据库中的匹配记录,并根据需要更新或添加新记录。在决定添加或更新时,Seek 方法的 NoMatch 属性非常有效。

这似乎在SQL Server中应该非常简单,但是我似乎找不到一个好的解决方案来让我检查匹配项,添加或更新以及使用多列索引。

将表下载到内存然后进行批量更新就可以了,但 ADO 的 Find 方法似乎不如索引 + 查找,并且它不能使用多列。使用支持索引查找的 ADO 提供程序连接到 SQL Server 也可以工作(Jet 4.0?),但我也找不到这方面的示例。

我错过了一些明显的东西吗?检查并向 SQL Server 添加或更新大量行的最佳方法是什么?谢谢

编辑: 以下是我目前在 Access/DAO 中执行的操作的简单示例:

Set rs = db.OpenRecordset("TableName", dbOpenTable)
With rs
.Index = "MultiFieldIndex"
'Loop through the input data
For i = 1 To 10000
.Seek "=", Criteria1, Criteria2
If Not .NoMatch Then
'Found a match, just update specific fields
!Field1 = a
!Field2 = b
Else
'No match found, add a new record then populate
.AddNew
!Field3 = c
!Field4 = d
End If
.Update
Next i
End With

仅使用 SQL 执行此类操作的最佳方法是什么?我仍然可能从加载完整目标表的断开连接的记录集开始,但当我不知道是否需要更新或添加新记录或输入条件的值时,不确定如何更新几千条记录。如何在没有索引 + 查找的情况下找到需要更新/检查的行?

或者我可以在内存中创建一个仅包含输入数据的临时表,然后以某种方式将该表"合并"到数据库中,数据库将弄清楚如何更新或添加?

我觉得这应该是一个非常基本的过程,但也许我只是缺少一些基本的 SQL 概念?

感谢所有的帮助!

解决方案是编写 SQL 查询创建过程dbo.prc_TableNameUpdIns(@parm1 int、@parm2 int) 如 如果存在(从 MyTable 中选择 *,其中 A = @parm1 和 B = @parm2) 更新。。。 还 插入。。。。

(您可以使用合并,但我建议不要这样做)

然后通过创建 AdoConnection(在 VBA 中)来调用 SPdim myAdoConnection as ADOConnection

将 X 暗为整数,将 Y 调暗为整数 X = 7 Y = 8

'设置 myAdoConnection '呼叫程序 myAdoConnection.prc_TableNameUpdIns X, Y

在SQL中处理尽可能多的代码是可取的。只有当您只需要更新表单而不一定需要更新数据库本身时,才需要执行此类 ADO 操作。

关于 ADO 连接 并进一步研究该主题,这只是一个指针

最新更新