2010-06-26 102 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