Tôi sử dụng này mã dưới dạng macro Excel để phân tích cú pháp tab chọn và trích xuất tên điện tử.
phân tích của tôi giả định rằng các sintax “chọn từ a, b, c" không được sử dụng.
Chỉ cần chạy nó chống lại truy vấn sql của bạn và nếu bạn không sadisfied với kết quả bạn sẽ có chỉ một vài dòng mã xa kết quả bạn mong đợi. Chỉ cần gỡ lỗi và sửa đổi mã cho phù hợp.
get_tables Sub()
sql_query = Cells(5, 1).Value
tables = ""
'get all tables after from
sql_from = sql_query
While InStr(1, UCase(sql_from), UCase("from")) > 0
i = InStr(1, UCase(sql_from), UCase("from"))
sql_from = Mid(sql_from, i + 5, Len(sql_from) - i - 5)
i = InStr(1, UCase(sql_from), UCase(" "))
While i = 1
sql_from = Mid(sql_from, 2, Len(sql_from) - 1)
i = InStr(1, UCase(sql_from), UCase(" "))
Wend
i = InStr(1, sql_join, Chr(9))
While i = 1
sql_join = Mid(sql_join, 2, Len(sql_join) - 1)
i = InStr(1, sql_join, Chr(9))
Wend
a = InStr(1, UCase(sql_from), UCase(" "))
b = InStr(1, sql_from, Chr(10))
c = InStr(1, sql_from, Chr(13))
d = InStr(1, sql_from, Chr(9))
MinC = a
If MinC > b And b > 0 Then MinC = b
If MinC > c And c > 0 Then MinC = c
If MinC > d And d > 0 Then MinC = d
tables = tables + "[" + Mid(sql_from, 1, MinC - 1) + "]"
Wend
'get all tables after join
sql_join = sql_query
While InStr(1, UCase(sql_join), UCase("join")) > 0
i = InStr(1, UCase(sql_join), UCase("join"))
sql_join = Mid(sql_join, i + 5, Len(sql_join) - i - 5)
i = InStr(1, UCase(sql_join), UCase(" "))
While i = 1
sql_join = Mid(sql_join, 2, Len(sql_join) - 1)
i = InStr(1, UCase(sql_join), UCase(" "))
Wend
i = InStr(1, sql_join, Chr(9))
While i = 1
sql_join = Mid(sql_join, 2, Len(sql_join) - 1)
i = InStr(1, sql_join, Chr(9))
Wend
a = InStr(1, UCase(sql_join), UCase(" "))
b = InStr(1, sql_join, Chr(10))
c = InStr(1, sql_join, Chr(13))
d = InStr(1, sql_join, Chr(9))
MinC = a
If MinC > b And b > 0 Then MinC = b
If MinC > c And c > 0 Then MinC = c
If MinC > d And d > 0 Then MinC = d
tables = tables + "[" + Mid(sql_join, 1, MinC - 1) + "]"
Wend
tables = Replace(tables, ")", "")
tables = Replace(tables, "(", "")
tables = Replace(tables, " ", "")
tables = Replace(tables, Chr(10), "")
tables = Replace(tables, Chr(13), "")
tables = Replace(tables, Chr(9), "")
tables = Replace(tables, "[]", "")
End Sub
Regular expressions là thứ ít nhất các vấn đề của bạn.Chỉ cần liệt kê tất cả các cách mà một bảng có thể xuất hiện trong một câu lệnh SQL là một vấn đề phức tạp. BTW. Bạn không bao giờ đề cập đến hương vị của SQL bạn đang cố gắng phân tích cú pháp. – JohnFx
Và vấn đề cơ bản mà anh ta đang cố gắng giải quyết là gì. –
Tôi không nghĩ rằng cụm từ thông dụng là giải pháp đúng, bạn cần có trình phân tích cú pháp SQL thay vào đó, hãy xem bài viết này: http://www.dpriver.com/blog/list-of-demos-illustrate-how-to-use- chung-sql-parser/get-cột-và-bảng-in-sql-script-net-phiên bản/ –