我正在尝试使用BE SQL Server 2012 Express中的记录更新本地Access 2007表。 我在这里的步骤:
在SQL Server中存在具有4个参数的存储过程以获取所需记录;
在Access VBA中,有一个函数可以调用SP并进行临时查询:
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
以下是传递给子例程的两个SQL字符串:
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];
我得到查询" qryTemp"创建得很好但是在UPDATE语句中我收到错误3073."操作必须使用可更新的查询"。
它有什么问题?
答案 0 :(得分:4)
Access始终将包含已加入的传递查询的UPDATE
视为只读。即使UPDATE
没有尝试改变传递中的值,也是如此。
正如您在评论中提到的,您可以将传递结果集存储在Access表中。加入该表代替UPDATE
中的传递应该有效。但是,你也提到过看起来有点脏。那里没有争论。 : - )
因此,您可能希望使用DLookup
来获取UPDATE
的 qryTemp.GraphHrs 值。这个应该可行,但我不知道执行速度是否可以接受......
UPDATE tbl_tmp_Tab_s
SET tbl_tmp_Tab_s.GraphHrs =
DLookup(
"GraphHrs",
"qryTemp",
"EmplCodeID0=" & EmplCodeID0
);
如果 EmplCodeID0 的数据类型是文本而不是数字,则在其值附近包含引号...
"EmplCodeID0='" & EmplCodeID0 & "'"