我正在将Excel应用程序从本地MS Access后端(使用DAO)转换为在Azure上运行的SQL Server(使用ADO)。
我用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做这样的事情的最好方法?我仍然可能开始加载完整目标表的断开连接的记录集,但是当我不知道我是否需要更新或添加新的或输入的值时,不知道如何更新几千条记录标准。如何在没有index + seek的情况下找到需要更新/检查的行?
或者我可以在内存中创建临时表,只有输入数据,然后以某种方式将该表“合并”到数据库,数据库将找出如何更新或添加?
我觉得这应该是一个非常基本的程序,但也许我只是缺少一些基本的SQL概念?
感谢您的帮助!
解决方案是编写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....
走
(你可以使用合并,但我建议反对它)
你通过创建一个AdoConnection(在VBA中)
dim myAdoConnection as ADOConnection
来调用SP
dim为整数,Y为整数X = 7 Y = 8
'设置myAdoConnection'调用proc myAdoConnection.prc_TableNameUpdIns X,Y
在SQL中处理尽可能多的代码是更可取的。您需要进行此类ADO操作的唯一时间是您只需更新表单而不必更新数据库本身。
关于ADO connection并且更多地研究这个主题,这只是一个指针