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)
);

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
);

これと他のすべての試みは、「MicrosoftOfficeAccessは更新クエリのすべてのレコードを更新できません...型変換の失敗のために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は、条件がfalseの場合でも、SWITCHステートメントで可能な各値を評価します。このため、ドメインがない場合、LEFT関数の長さパラメーターは負の数でした。

4

1 に答える 1

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);

これはかなり高速に実行されます。私はそれをテストし、この関数を200万回呼び出すのに13秒かかりました(これには実際の更新は含まれず、呼び出しのみが含まれていました)。

于 2012-11-28T04:04:31.250 に答える