2012-11-27 82 views
0

我有一张表,其中包含一列可以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) 
); 

我试过几个查询,更新计算机名称列,最有前途的是:

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场(S)由于类型转换失败......”

结果表看起来像:

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函数的长度参数是负数。

+0

我会澄清这个问题。 comp1和1.2.0.1应位于ComputerName列中。 – mjoshawa

+0

这是在Access中发生的。我可以为此使用一个函数(比如迭代一个记录集),但根据我的经验,Access SQL查询速度要快得多。可能会有成千上万的记录。 – mjoshawa

回答

2

我认为@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); 

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

+0

我不知道你可以从查询中调用一个函数。我今天下午试试这个。谢谢。 – mjoshawa

+0

只要您在Access中运行查询,就可以进行操作。如果您只是通过ODBC或其他链接访问数据库,它将不起作用。 –

+0

这和你说的那样工作。非常感谢你。 – mjoshawa