【问题标题】:Access update query unable to update specific records访问更新查询无法更新特定记录
【发布时间】:2012-11-27 19:54:56
【问题描述】:

我有一个表格,其中有一列可 ping 的计算机名称,作为更大表格的一部分提供给我。计算机名称可以包含点域名和/或 IP 地址。我需要将计算机名和域名分开到各自的列中。

例如:

ComputerFullName   | ComputerName | Domain
comp1              |              |
1.2.0.1            |              |
comp3.place.com    |              |
1.2.1.45.place.com |              |

我可以使用以下查询来填写域:

UPDATE Example 
SET Domain = SWITCH(
   ComputerFullName LIKE '#*.#*.#*.#*.*', MID(ComputerFullName, INSTR(1, REPLACE(ComputerFullName, '.', ' ', 1, 3), '.') + 1)
   , ComputerFullName LIKE '#*.#*.#*.#*', NULL
   , INSTR(1, ComputerFullName, '.') <> 0, MID(ComputerFullName, INSTR(1, ComputerFullName, '.') + 1)
);

我尝试了几个查询来更新 ComputerName 列,最有希望的是:

UPDATE Example 
SET ComputerName = SWITCH(
   ComputerFullName LIKE '#*.#*.#*.#*.*', LEFT(ComputerFullName, INSTR(1, ComputerFullName, Domain) - 2)
   , ComputerFullName LIKE '#*.#*.#*.#*', ComputerFullName
   , INSTR(1, ComputerFullName, '.') <> 0, LEFT(ComputerFullName, INSTR(1, ComputerFullName, '.') - 1)
   , TRUE, ComputerFullName
);

此尝试和其他所有尝试都返回错误消息“Microsoft Office Access 无法更新更新查询中的所有记录...由于类型转换失败,Access 未更新 2 个字段... "

生成的表格如下所示:

ComputerFullName   | ComputerName | Domain
comp1              |              |
1.2.0.1            |              |
comp3.place.com    | comp3        | place.com
1.2.1.45.place.com | 1.2.1.45     | place.com

我想要的表是:

ComputerFullName   | ComputerName | Domain
comp1              | comp1        |
1.2.0.1            | 1.2.0.1      |
comp3.place.com    | comp3        | place.com
1.2.1.45.place.com | 1.2.1.45     | place.com

有什么建议吗?


在使用以下答案时,我意识到为什么上面的查询不起作用。即使条件为假,Access 也会评估 SWITCH 语句中的每个可能值。因此,LEFT 函数的长度参数在没有域时为负数。

【问题讨论】:

  • 我会澄清这个问题。 comp1 和 1.2.0.1 应该在 ComputerName 列中。
  • 这是在 Access 本地发生的。我可以为此使用一个函数(例如遍历记录集),但根据我的经验,Access SQL 查询要快得多。可能有成千上万条记录。

标签: sql ms-access-2007 jet-sql


【解决方案1】:

我认为@HansUp 指的是从您的查询中调用一个函数来拆分您的姓名。试试这个功能:

Function SplitName(ByRef CFN As String, PartWanted As Integer) As String
    Dim CFN2 As String
    Dim I As Integer
    CFN2 = Replace(CFN, ".", "")
    If IsNumeric(CFN2) Then 'assume it's an IP address
        CFN = CFN & "|"
    Else
        Select Case Len(CFN) - Len(CFN2) 'we count the dots
            Case Is > 1 'at least 2 dots means computer & domain names
                I = InStrRev(CFN, ".")
                I = InStrRev(CFN, ".", I - 1)
                Mid(CFN, I) = "|"
            Case Is = 1 ' 1 dot means domain name only
                CFN = "|" & CFN
            Case Else '0 dots means computer name only
                CFN = CFN & "|"
        End Select
    End If
    SplitName = Split(CFN, "|")(PartWanted)
End Function

PartWanted 参数可以是 0(获取计算机名称)或 1(获取域名)。所以你的查询看起来像:

UPDATE Example 
SET Computername = SplitName([ComputerFullName],0), Domain = SplitName([ComputerFullName],1);

这运行得非常快。我测试了它,调用这个函数 200 万次花了 13 秒(这不包括实际的更新,只是调用)。

【讨论】:

  • 我不知道您可以从查询内部调用函数。今天下午我会试试这个。谢谢。
  • 您可以在 Access 中运行查询。如果您只是通过 ODBC 或其他链接访问数据库,它将无法正常工作。
  • 这和你说的一样有效。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2017-06-06
相关资源
最近更新 更多