VBA SQL - 将代码从“插入到”更改为“更新”表

时间:2016-12-28 23:13:57

标签: sql vba ms-access sql-update sql-insert

我已查找并寻找答案,无法将答案转换为我的特定代码。我有一些访问数据库的代码作为INSERT TO,但我希望它更新一个表。将它更改为UPDATE后我无法运行它。

以下代码有效,它的作用是将符合条件的值添加到现有表的开头。但我希望它在名为“Sonoco2016_xlsx”的表中更新现有的空白列“O_StateRegion”。我将INSERT INTO切换到UPDATE的努力都失败了。 (参见我努力的第二个代码示例)

Private Sub InsertStateRegion()

On Error GoTo InsertRegions_Err

Dim db As Database
Dim rs As Recordset
Dim strSQL As String

Set db = CurrentDb
Set rs = db.OpenRecordset("Select [OriginState] from [Sonoco2016_xlsx];")

rs.MoveFirst
While Not rs.EOF

    strSQL = "UPDATE [Sonoco2016_xlsx] ([O_StateRegion])"
    strSQL = strSQL & " SELECT [StateRegion] FROM [tblStates]"
    strSQL = strSQL & " WHERE [tblStates].[StateAbbrev]='" & rs![OriginState] & "' "

    db.Execute (strSQL), dbFailOnError

rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set db = Nothing

btnInsertRegions_Exit:
    Exit Sub

InsertRegions_Err:
    MsgBox Err.Description & " in btnInsertRegions"
    Resume btnInsertRegions_Exit

End Sub

以下是我将其转换为UPDATE的努力

Private Sub btnInsertRegions_Click()

On Error GoTo InsertRegions_Err

Dim db As Database
Dim rs As Recordset
Dim strSQL As String

Set db = CurrentDb
Set rs = db.OpenRecordset("Select [OriginState] from [Sonoco2016_xlsx];")

rs.MoveFirst
While Not rs.EOF

    strSQL = "UPDATE [Sonoco2016_xlsx] ([O_StateRegion])"
    strSQL = strSQL & " SET [Sonoco2016_xlsx].[O_StateRegion]=[tblStates].[StateRegion]"
    strSQL = strSQL & " WHERE [tblStates].[StateAbbrev] = '" & rs![OriginState] & "' "

    db.Execute (strSQL), dbFailOnError

rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set db = Nothing

btnInsertRegions_Exit:
    Exit Sub

InsertRegions_Err:
    MsgBox Err.Description & " in btnInsertRegions"
    Resume btnInsertRegions_Exit

End Sub

2 个答案:

答案 0 :(得分:0)

您希望实现的正确语法是

UPDATE [Sonoco2016_xlsx] 
    INNER JOIN [tblStates]
        ON [tblStates].[StateAbbrev] = [Sonoco2016_xlsx].[OriginState]
SET [Sonoco2016_xlsx].[O_StateRegion]=[tblStates].[StateRegion];

您将在不使用记录集的情况下执行。

但是,请注意,只有[StateAbbrev]具有唯一索引,例如如果它是[tblStates]的主键。否则,更新将是不明确的。

此外,无法在set语句中使用子查询,如

SET [Sonoco2016_xlsx].[O_StateRegion]=(SELECT [StateRegion] 
                                       FROM = [tblStates] 
                                       WHERE [StateAbbrev] = rs![OriginState])

因为UPDATE语句中禁止使用子查询。

答案 1 :(得分:0)

感谢M Doerner,这个答案对我有用!

Private Sub btnInsertRegions_Click()

On Error GoTo InsertRegions_Err

Dim db As Database
Dim rs As Recordset
Dim strSQL As String

Set db = CurrentDb
Set rs = db.OpenRecordset("Select [OriginState] from [Sonoco2016_xlsx];")

rs.MoveFirst
While Not rs.EOF

    strSQL = "UPDATE [Sonoco2016_xlsx] INNER JOIN [tblStates]"
    strSQL = strSQL & " ON [tblStates].[StateAbbrev] = [Sonoco2016_xlsx].[OriginState]"
    strSQL = strSQL & " SET [Sonoco2016_xlsx].[O_StateRegion]=[tblStates].[StateRegion]"


    db.Execute (strSQL), dbFailOnError

rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set db = Nothing

btnInsertRegions_Exit:
    Exit Sub

InsertRegions_Err:
    MsgBox Err.Description & " in btnInsertRegions"
    Resume btnInsertRegions_Exit

End Sub