2010-06-26 14 views
5

Mam ciąg reprezentujący zapytanie SQL i muszę wyodrębnić nazwy tabel z tego łańcucha. Na przykład:Jak parsować instrukcję SQL Query dla nazw tabel

SELECT * FROM Customers 

Zwróci "Klienci". Lub

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 

Zwróci "Klienci, adresy". Coraz bardziej zaawansowane:

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

po prostu wrócić „mojatabela”

(uwaga, może mam typo'd zapytania, ale masz pomysł).

Jaki byłby najlepszy/najdokładniejszy sposób osiągnięcia tego?

+0

Pytanie "dlaczego?" przychodzi mi na myśl .... –

+0

Czy celujesz w konkretny RDBMS/Dialect? Jest kilka pytań dotyczących SO analizowania SQL, np. http://stackoverflow.com/questions/589096/parsing-sql-code-in-c Nic szczególnie rozstrzygającego, co widziałem. –

+0

Jeśli chodzi o "dlaczego", to dlatego, że parsuję plik dziennika zapytań i wyświetlam najczęściej odwiedzane tabele, operacje itp. Nie, że to powinno mieć znaczenie :) Jeśli chodzi o to, na co celuję, jest to MS-SQL. – esac

Odpowiedz

4

Oto sposób to zrobić, korzystając z narzędzia komercyjnego (sqlparser.com $ 149, darmowa wersja próbna)

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

Należy pamiętać, że liczy się 'c' i 'a' jak stoły, ale byłoby to dość proste odfiltrowanie nazwy pojedynczych znaków z wyników

nie używam ani właścicielem tego narzędzia, tylko coś znalazłem po poszukiwaniach ...

+0

To dobry początek, chociaż fakt, że wybiera "c" i "a", jest denerwujący, ponieważ niektóre z nich mają aliasy dłuższe. – esac

Powiązane problemy