我正在将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概念?
感谢所有帮助!
答案 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 并进一步研究该主题,这只是一个指针