Sql server 查询不可更新

Sql server 查询不可更新,sql-server,ms-access,stored-procedures,vba,Sql Server,Ms Access,Stored Procedures,Vba,我正在尝试使用来自BE SQL Server 2012 Express的记录更新本地Access 2007表。 我的步骤如下: SQL Server中存在具有4个参数的存储过程以获取所需的记录 在Access VBA中,有调用SP和进行临时查询的功能: 以下是传递给子例程的两个SQL字符串: 我得到了创建良好的查询“qryTemp”,但在UPDATE语句中得到了错误3073。“操作必须使用可更新查询” 有什么问题吗?Access总是将包含联接传递查询的更新视为只读。即使更新没有试图改变传递中

我正在尝试使用来自BE SQL Server 2012 Express的记录更新本地Access 2007表。 我的步骤如下:

  • SQL Server中存在具有4个参数的存储过程以获取所需的记录

  • 在Access VBA中,有调用SP和进行临时查询的功能:

  • 以下是传递给子例程的两个SQL字符串:

    我得到了创建良好的查询“qryTemp”,但在UPDATE语句中得到了错误3073。“操作必须使用可更新查询”


    有什么问题吗?

    Access总是将包含联接传递查询的
    更新视为只读。即使
    更新
    没有试图改变传递中的值,这一点仍然成立

    正如您在注释中提到的,您可以将传递结果集存储在访问表中。在
    UPDATE
    中连接该表以代替传递应该是可行的。不过,你也提到了这似乎有点脏。没有参数。:-)

    因此,您可能更愿意使用
    DLookup
    获取
    更新的qryTemp.GraphHrs值。这个应该可以,但我不知道执行速度是否可以接受

    更新tbl\u tmp\u选项卡
    设置tbl\U tmp\U选项卡\U图形=
    德卢库普(
    “GraphHrs”,
    “qryTemp”,
    “EmplCodeID0=“&EmplCodeID0
    );
    
    如果EmpCodeID0的数据类型是文本而不是数字,请在其值周围加引号

    “empcodeid0=”&empcodeid0&“
    
    Access始终将包含联接传递查询的
    更新视为只读。即使
    更新
    没有试图改变传递中的值,这一点仍然成立

    正如您在注释中提到的,您可以将传递结果集存储在访问表中。在
    UPDATE
    中连接该表以代替传递应该是可行的。不过,你也提到了这似乎有点脏。没有参数。:-)

    因此,您可能更愿意使用
    DLookup
    获取
    更新的qryTemp.GraphHrs值。这个应该可以,但我不知道执行速度是否可以接受

    更新tbl\u tmp\u选项卡
    设置tbl\U tmp\U选项卡\U图形=
    德卢库普(
    “GraphHrs”,
    “qryTemp”,
    “EmplCodeID0=“&EmplCodeID0
    );
    
    如果EmpCodeID0的数据类型是文本而不是数字,请在其值周围加引号

    “empcodeid0=”&empcodeid0&“
    
    由于传递查询是只读的,Access将连接该传递的
    更新也视为只读。但我不更新传递查询。我只是使用pass-through中的数据来更新本地访问表。我理解。这是一个不幸的访问限制。您的
    更新
    不尝试更改qryTemp中的值并不重要。Access会抱怨
    更新
    不可更新。可能需要其他解决方案来实现吗?我知道我可以从临时查询创建临时表,然后从临时表进行更新,但这听起来有点脏…由于传递查询是只读的,Access将连接该传递的
    更新
    也视为只读。但我不更新传递查询。我只是使用pass-through中的数据来更新本地访问表。我理解。这是一个不幸的访问限制。您的
    更新
    不尝试更改qryTemp中的值并不重要。Access会抱怨
    更新
    不可更新。可能需要其他解决方案来实现吗?我知道我可以从临时查询创建临时表,然后从临时表进行更新,但这听起来有点脏…你的方法真的很好。但由于我需要更新30个字段(在示例中,一个字段只是为了简单起见),所以我使用了另一种涉及两个记录集的方法:源“qryTemp”和目标“tbl_tmp_tabs”。只是好奇,在更新30个字段时,哪种方法会显示更好的性能?我怀疑为每个更新的行计算30个DLookup表达式会对数据库引擎造成过大的负担。因此,如果您现在所做的工作表现令人满意,请忘记
    DLookup
    。这是我最好的猜测。:-)你的方法真的很好。但由于我需要更新30个字段(在示例中,一个字段只是为了简单起见),所以我使用了另一种涉及两个记录集的方法:源“qryTemp”和目标“tbl_tmp_tabs”。只是好奇,在更新30个字段时,哪种方法会显示更好的性能?我怀疑为每个更新的行计算30个DLookup表达式会对数据库引擎造成过大的负担。因此,如果您现在所做的工作表现令人满意,请忘记
    DLookup
    。这是我最好的猜测。:-)
    Public Function UpdateLocalSQLTable(strTable As String, strSQL As
    String, strSQL1 As String) As Boolean 
    On Error GoTo Err_Handler
        Dim qdf As DAO.QueryDef
        Dim strQuery As String
        Dim conConnectString As String
    
    strQuery = "qryTemp"
    DoCmd.Close acTable, strTable
    
    If IsQueryExists(strQuery) Then DoCmd.DeleteObject acQuery, strQuery
    
    conConnectString = GetUserParams(NetConnDat)
    
    Set qdf = CurrentDb.CreateQueryDef(strQuery)
    With qdf
        .Connect = conConnectString
        .SQL = strSQL
        .Close 
    End With
    
    CurrentDb.Execute strSQL1
    UpdateLocalSQLTable = True
    
    qdf.Close
    
    Exit_Handler:
        Set qdf = Nothing
        Exit Function 
    Err_Handler:
        Call LogError(Err.Number, Err.Description, "UpdateLocalSQLTable", , True)
        Resume Exit_Handler 
    End Function
    
    strSQL=EXEC [dbo].[usp_TabelMakeTmpTable] @strEmp='0033111',@strMon='2014.12',@strDep='STR',@strPam='STR3'
    
    strSQL1=UPDATE tbl_tmp_Tab_s INNER JOIN qryTemp ON tbl_tmp_Tab_s.EmplCodeID0 = qryTemp.EmplCodeID0 SET tbl_tmp_Tab_s.GraphHrs = [qryTemp]![GraphHrs];