首页 > 解决方案 > 用户编辑由直通查询的结果过滤的链接 SQL Server 表

问题描述

我正在运行 MS Access 2016 连接到 SQL Server 上的链接表(2012,我认为,如果重要的话),以便允许单个用户(我)快速操作该表中的数据。我有一个相当密集的直通查询,它创建一个主键值列表,表示表中的数据有问题的行(通常只是不应该有空值的空值,还有值和无效日期的无效组合)。

我想只显示由我的传递查询标识的行,以便我可以快速输入缺失值并进行其他更正。但是,我完全不知道如何做到这一点。

为了尝试遵循最佳实践,我尝试使相关行以只有特定字段可编辑的形式显示。但是,即使我设置了关系,MS Access 仍会不断抛出关于未在查询和表之间定义关系的错误。

失败了,我尝试使用相关查询和表进行可编辑查询,但我所做的查询都没有可编辑的记录集,原因我不太明白。据我所知,查询和表之间的关系是一对一的,链接的表通常可以直接在 MS Access 中编辑。即使我放弃了附加信息查询并将链接表加入到我的错误查找直通查询中,我也无法创建可编辑的记录集。

有没有实现我的目标的好方法?我开始觉得我最好的选择是在 Access 中创建某种临时表来存储我正在编辑的值,然后将它们合并到链接表中,但这对我来说似乎有点笨拙。我还有其他选择吗?

标签: sql-serverms-accessjoinsql-updatepass-through

解决方案


好的,也许您在找到那些坏行(或任何原因)后拥有存储过程,您让它返回该键列表。

那么下一个问题就变成了?

好吧,如果你只返回说 < 100 行,那么我认为只返回一串 PK 值就可以了。

因此,存储过程可以:

返回一个字符串以使用 pk 值访问,比如

34,3443,3,55333

(在存储过程的最后一条语句中,只需对字符串进行选择,Access 就会看到一行一列作为记录集)。

因此,您的代码将类似于:

Sub EditBad()

  Dim strKeys    As String            ' list of keys from stored procedure
  Dim rstKeys    As DAO.Recordset
  
  
  With CurrentDb.QueryDefs("MyStoredProc")
     .SQL = "exec sp_myproc " & "some possible parameters you send to stored procedure"
     Set rstKeys = .OpenRecordset
  End With
  
 strKeys = rstKeys(0)
 rstKeys.Close
 
 ' now launch our edit form based on the keys returned
 
 Dim strWhere    As String
 
 strWhere = "ID IN (" & strKeys & ")"
 
 DoCmd.OpenForm "frmEditBadGuys", , , strWhere
 
 
End Sub

现在,如果要返回的坏键列表会变大?好吧,然后从存储过程中,只需将值作为表返回。因此,代替存储过程中“键字符串”的单个选择,您返回要检查的错误键值的选择。

所以,现在我们有:

  With CurrentDb.QueryDefs("MyStoredProc")
     .SQL = "exec sp_myproc " & "some possible parameters you send to stored procedure"
     Set rstKeys = .OpenRecordset
  End With
 strKeys = ""
 do while rstKeys.EOF = False
    if strKeys <> "" then strKeys = strKeys & ","
    strKeys = strKyes & rstKeys(0)
    .movenext
 loop
 rstKeys.Close

 strWhere = "ID IN (" & strKeys & ")"
 
 DoCmd.OpenForm "frmEditBadGuys", , , strWhere

同样,我认为这个解决方案适用于 100-200 行。

如果返回的结果是 1000-2000 条记录?那么,“in (value1, value2) 等字符串变得太长,运行太慢,并且会爆炸——你限制在我认为大约 4000 个字符——但是 SQL 中的这样一个 where 子句已经太久了,而且它龟跑得慢。

那么,代替将返回的记录集处理成一个长字符串?

将结果发送到本地临时表。然后,您可以创建一个可编辑的表单,并将本地表连接到链接表。在这种情况下,请确保基表是链接表,并且您可能必须对本地临时表进行左连接(内部可能有效,但左连接应该有效。

如果真的需要性能?好吧,将数据 sql 服务器端发送到临时表(现在,临时表,我不是指实际的 sql 服务器临时表,因为您不能在 Access 中使用这些客户端。(您使用的设置取决于关于这个应用程序必须是多用户的)。

因此,您可以创建一个 sql server 视图(执行此连接)。请记住,sql server 视图可以从客户端访问中编辑(与传递查询不同——它们在大多数情况下是只读的)。

因此,您还可以在“临时”表 sql 端有一个“用户”列,并且不仅添加 PK 值,还添加用户列名称。然后在访问客户端?您启动“坏人/坏数据”编辑表单并使用基于用户名的 where 子句(这将允许多用户设置)。到目前为止,这种设置将表现最好。

因此,让存储过程回吐:

  • 从具有键的存储过程中选择一列,并尝试将“in 子句”作为 where 子句针对您知道有效的客户端表单(可以编辑数据)。但是,我似乎记得访问客户端在 SQL Server 的“in 子句”方面做得不好——你必须尝试一下这个想法。

  • PK 值的本地表也可以很好地工作 - 代码不多,这将基于链接表联接 + 到您写出的本地 PK 值表的左联接。如果链接表不是太大,那么这可以工作(但同样会出现性能问题)。

因此,最终性能将是服务器端视图,并且它被加入到您想要处理的错误 PK 值的临时工作表中。而对于多用户,那么您必须添加一个“用户”列或某种方式来允许多个用户。请记住,访问客户端的“where”子句对视图非常有效。(但不是那些 where "in (1,2,3) 类型的 where 子句!

所以,上面有3条可能的道路可以尝试。


推荐阅读