2010-06-26 52 views
5

Tôi có một chuỗi đại diện cho truy vấn SQL và tôi cần trích xuất tên của các bảng từ chuỗi đó. Ví dụ:Cách phân tích cú pháp câu lệnh truy vấn SQL cho tên của các bảng

SELECT * FROM Customers 

Sẽ trả lại "Khách hàng". Hoặc

SELECT * FROM Customers c, Addresses a WHERE c.CustomerName='foo' 

SELECT a.AddressZip FROM Customers c 
INNER JOIN Addresses a ON c.AddressId=a.AddressId 

Sẽ trả lại "Khách hàng, địa chỉ". Bắt tiên tiến hơn:

(SELECT B FROM (SELECT C FROM (SELECT Element AS C FROM MyTable))) 

sẽ chỉ đơn giản là trở về "MyTable"

(Lưu ý, tôi có thể đã typo'd các truy vấn nhưng bạn sẽ có được ý tưởng).

Cách tốt nhất/chính xác nhất để hoàn thành điều này là gì?

+0

Câu hỏi "Tại sao?" lò xo để ghi nhớ .... –

+0

Bạn có đang nhắm mục tiêu đến bất kỳ RDBMS/Phương ngữ cụ thể nào không? Có một vài câu hỏi về SO về phân tích cú pháp SQL, ví dụ: http://stackoverflow.com/questions/589096/parsing-sql-code-in-c Không có gì đặc biệt kết luận mà tôi đã thấy mặc dù. –

+0

Đối với 'lý do' là vì tôi đang phân tích cú pháp một truy vấn và hiển thị các bảng, hoạt động, vv .. không nhất thiết phải là vấn đề :) Đối với những gì tôi nhắm mục tiêu, đó là MS-SQL. – esac

Trả lời

4

Đây là một cách để làm điều đó, sử dụng một tiện ích thương mại (sqlparser.com $ 149, dùng thử miễn phí)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using gudusoft.gsqlparser; 

namespace GeneralSqlParserTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TGSqlParser sqlparser = new TGSqlParser(TDbVendor.DbVMssql); 

      sqlparser.SqlText.Text = "SELECT * FROM Customers c, Addresses a WHERE c.CustomerName='foo'"; 
      sqlparser.OnTableToken += new TOnTableTokenEvent(OnTableToken); 

      int result = sqlparser.Parse(); 
      Console.ReadLine(); 
     } 

     static void OnTableToken(object o, gudusoft.gsqlparser.TSourceToken st, gudusoft.gsqlparser.TCustomSqlStatement stmt) 
     { 
      Console.WriteLine("Table: {0}", st.AsText); 
     } 
    } 
} 

Lưu ý rằng nó đếm 'c' và 'a' như bảng, nhưng nó sẽ là khá đơn giản để lọc ra các tên nhân vật duy nhất từ ​​kết quả của bạn

tôi không sử dụng hoặc sở hữu công cụ này, chỉ cần một cái gì đó tôi tìm thấy sau khi một số tìm kiếm ...

+0

Đó là một khởi đầu tốt, mặc dù thực tế là nó chọn lên 'c' và 'a' là gây phiền nhiễu khi một số được đặt biệt hiệu với tên dài hơn. – esac

Các vấn đề liên quan