2010-06-26 4 views
5

Tengo una cadena que representa una consulta SQL, y necesito extraer los nombres de las tablas de esa cadena. Por ejemplo:Cómo analizar una instrucción SQL Query para los nombres de las tablas

SELECT * FROM Customers 

Devolvería "Clientes". O

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 

Devolvería "Clientes, direcciones". Conseguir más avanzada:

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

simplemente volver "MyTable"

(Nota, puede que haya typo'd las consultas, pero usted consigue la idea).

¿Cuál sería la mejor/más precisa forma de lograr esto?

+0

La pregunta "¿Por qué?" viene a la mente ... –

+0

¿Está apuntando a cualquier RDBMS/Dialecto en particular? Hay algunas preguntas sobre SO sobre el análisis SQL, p. http://stackoverflow.com/questions/589096/parsing-sql-code-in-c Nada particularmente concluyente que he visto. –

+0

En cuanto a 'por qué' es porque estoy analizando un archivo de registro de consultas y mostrando las tablas, operaciones, etc. más accedidos, no es que importe :) En cuanto a a qué me estoy dirigiendo, es MS-SQL. – esac

Respuesta

4

Aquí está una manera de hacerlo, mediante una utilidad comercial (sqlparser.com $ 149, prueba gratuita)

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

Nota que cuenta 'c' y 'a' como tablas, pero sería bastante fácil de filtrar los nombres de los personajes individuales de sus resultados

no uso o el propio esta herramienta, simplemente algo que encontré después de buscar ...

+0

Es un buen comienzo, aunque el hecho de que capte 'c' y 'a' es molesto ya que algunos tienen un alias con nombres más largos. – esac

Cuestiones relacionadas