2012-11-27 61 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