我已經張貼了關於我的方法解決這個問題很多次在許多不同的論壇,但我只是複述我使用的方法的基本結構。儘管如此,沒有辦法一步完成。
更新來自外部數據源的現有記錄。
插入不存在的記錄。
這假定可用於現有的表與外部數據源連接的公共主鍵。
任務#2非常簡單,只是不存在的記錄的外連接。
對於#1,可以使用蠻力,爲主鍵以外的每個字段使用SET編寫UPDATE語句,但是我認爲這是凌亂和不必要的。另外,由於我有很多複製的應用程序,我不能這樣做,因爲這會導致錯誤衝突(當字段更新爲與開始時相同的值時)。
因此,爲此,我使用DAO並編寫一個即時SQL語句來更新COLUMN-BY-COLUMN。其基本結構是這樣的:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim fld As DAO.Field
Dim strField As String
Dim strSet As String
Dim strWhere As String
Dim strSQL As String
Set db = CurrentDB
Set rs = db.OpenRecordset("DestinationTable")
For Each fld in rs.Fields
strField = fld.Name
If strField <> "PKField" Then
strSet = "DestinationTable." & strField & " = ExternalTable." & strField
strWhere = "Nz(DestinationTable." & strField & ",'') = Nz(ExternalTable." & strField & ", '')"
strSQL = "UPDATE DestinationTable "
strSQL = strSQL & " SET " & strSet
strSQL = strSQL & " WHERE " & strWhere
db.Execute strSQL, dbFailOnError
Debug.Print strField & ": " & db.RecordsAffected
End If
Next fld
現在,複雜的部分是處理數字與日期與字符串字段,所以你必須有一定的邏輯寫的WHERE子句使用正確的報價和其他分隔符根據字段類型。而不是測試字段類型,我一般只使用一個情況下,選擇這樣的,使得字符串字段的默認:
Dim strValueIfNull As String
Select Case strField
Case "DateField1", "DateField2", "NumericField2", "NumericField2", "NumericField3"
strValueIfNull = "0"
Case Else
strValueIfNull = "''"
strWhere = "Nz(DestinationTable." & strField & ", '') = Nz(ExternalTable." & strField & ", '')"
End Select
strWhere = "Nz(DestinationTable." & strField & ", " & strValueIfNull & ") = Nz(ExternalTable." & strField & ", " & strValueIfNull & ")"
我能有細節有錯,但你的想法,我想。
這意味着,因爲有更新的領域,你會只運行儘可能多的SQL更新,而你只更新需要更新的記錄。如果你還用「最近更新」的日期標記記錄,那麼你應該在UPDATE SQL中這樣做,並且你只想在真正具有不同值的記錄上這樣做。
這可能會幫助你的搜索就知道,這是經常被稱爲「更新插入」。 – DOK 2010-06-07 18:57:15