Sql server 查询不可更新
我正在尝试使用来自BE SQL Server 2012 Express的记录更新本地Access 2007表。 我的步骤如下: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总是将包含联接传递查询的更新视为只读。即使更新没有试图改变传递中
有什么问题吗?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];