使用SQL Server / ADO对访问/ DAO进行索引+搜索的替代方法

时间:2019-04-18 05:32:55

标签: sql-server excel vba ado dao

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

我使用DAO执行的常见任务是索引+查找方法,以扫描大量输入行(〜10,000,并使用多字段索引),检查数据库中的匹配记录,并更新或添加新记录为需要。决定添加或更新时,Seek方法的NoMatch属性可以很好地工作。

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

将表下载到内存中然后进行批处理更新就可以了,但是ADO的Find方法似乎不如index + seek,并且它不能使用多列。使用支持索引查找的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概念?

感谢所有帮助!

1 个答案:

答案 0 :(得分:0)

解决方案是编写一个SQL查询 create procedure dbo.prc_TableNameUpdIns (@parm1 int, @parm2 int) AS IF EXISTS (SELECT * from MyTable WHERE A = @parm1 AND B = @parm2) UPDATE ... ELSE INSERT....

GO

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

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

dim X as Integer, Y as Integer X = 7 Y = 8

'SET the myAdoConnection 'Calling the proc myAdoConnection.prc_TableNameUpdIns X, Y

最好在SQL中处理尽可能多的代码。唯一需要执行这种类型的ADO操作的时间是当您需要更新表单 only 而不是数据库本身时。

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