2010-06-26 100 views
5

我有一個字符串表示一個SQL查詢,我需要從該字符串中提取表的名稱。例如:如何解析表的名稱SQL查詢語句

SELECT * FROM Customers 

會返回「客戶」。或

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 

會返回「客戶,地址」。獲取更先進:

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

僅返回 「MyTable的」

(注意,我可能已經typo'd的查詢,但你的想法)。

完成此操作的最佳/最準確的方法是什麼?

+0

問題「爲什麼?」彈出想法.... – 2010-06-26 01:51:15

+0

你是否針對任何特定的RDBMS /方言?有關於解析SQL的一些問題,例如http://stackoverflow.com/questions/589096/parsing-sql-code-in-c沒有什麼特別的結論,但我已經看到。 – 2010-06-26 02:08:20

+0

至於'爲什麼'這是因爲我解析查詢的日誌文件並顯示訪問最多的表,操作等。不是它應該重要:)至於我瞄準什麼,它是MS-SQL。 – esac 2010-06-26 02:15:22

回答

4

這裏有一個辦法做到這一點,使用商業實用程序(sqlparser.com $ 149,免費試用)

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

注意,它計算的「C」和「A」爲表,但是這將是非常簡單從結果中過濾掉單字符名稱

我不使用或擁有這個工具,只是我經過一番搜索發現...

+0

這是一個好的開始,雖然它拿起'c'和'a'這個事實令人討厭,因爲有些人的名字更長。 – esac 2010-06-26 15:51:14