2

DBクエリの「FROM」部分に続く単語を取得したい。次のコードでは、機能する場合と機能しない場合があります。テーブル名の長さに依存するようです。

Private Function GetTableName(Q As String) As String
    'SELECT * FROM _table WHERE column LIKE '%test%'  

    Dim FROMPos As Integer = Q.ToLower.IndexOf("FROM".ToLower)

    If FROMPos > -1 Then
        Dim FirstSpacePos As Integer = Q.ToLower.IndexOf(Chr(32), FROMPos)

        If FirstSpacePos > -1 Then
            Dim EndSpacePos As Integer = Q.ToLower.IndexOf(Chr(32), FirstSpacePos + 1)

            If EndSpacePos > -1 Then
                'MsgBox(Q.Substring(FirstSpacePos + 1, EndSpacePos - FirstSpacePos))
                Return Q.Substring(FirstSpacePos + 1, EndSpacePos - FirstSpacePos)
            Else
                Return ""
            End If
        Else
            Return ""
        End If
    Else
        Return ""
    End If
End Function
4

2 に答える 2

1

場合によっては、適切な正規表現だけで十分な場合があります (LinqPad でテストされているため、この.Dump()呼び出しが行われます)。

Dim queries = New List(Of String)() From { _
    "select * from my_table", _
    "select * from [dbo].[table with spaces] tws where tws.id = @id", _
    "select * from [dbo].[table with spaces] tws where tws.id in (select x.id from [some_other_table] x)" _
}

For Each query As String In queries
    Dim matches = Regex.Matches(query, "from\s+((?:(?:\[[^\]]+\])|[^\s])+)", RegexOptions.IgnoreCase)
    For Each m As Match In matches
        m.Groups(1).Value.Dump()
    Next
Next

結果:

my_table
[dbo].[table with spaces]
[dbo].[table with spaces]
[some_other_table]
于 2013-08-10T13:01:29.020 に答える