2009-02-26 15 views
59

Quiero analizar el código SQL usando C#.Analizando el código SQL en C#

Específicamente, ¿hay algún analizador disponible de forma gratuita que pueda analizar el código SQL y generar un árbol o cualquier otra estructura a partir de él? También debería generar el árbol adecuado para las estructuras anidadas.

También debe devolver qué tipo de instrucción representa el nodo de este árbol.

Por ejemplo, si el nodo contiene una condición de bucle, debe devolver que se trata de un "tipo de bucle" de un nodo.

¿O hay alguna manera por la cual puedo analizar el código en C# y generar un árbol del tipo que quiero?

+0

http://stackoverflow.com/questions/34102835 – user423430

Respuesta

9

Utilice Microsoft Entity Framework (EF).

Tiene un analizador "Entity SQL", que construye un árbol de expresión,

using System.Data.EntityClient; 
... 
EntityConnection conn = new EntityConnection(myContext.Connection.ConnectionString); 
conn.Open(); 
EntityCommand cmd = conn.CreateCommand(); 
cmd.CommandText = @"Select t.MyValue From MyEntities.MyTable As t"; 
var queryExpression = cmd.Expression; 
.... 
conn.Close(); 

O algo así, comprobar que funciona en MSDN.

Y es todo en Ballmers marque :-)

También hay uno en el Proyecto de Código, SQL Parser.

Buena suerte.

+23

Eso toma "Entity-SQL", un dialecto de SQL; Creo que el OP significa SQL normal, como "Transact-SQL" (dialecto de SQL Server). En breve; esto no funcionará –

+0

Por lo que puedo decir, no hay pistas en la pregunta orgional de ninguna manera? Entonces, antes de corregir esto, ¿debemos esperar a que @aaCog confirme? – TFD

+0

Bueno, me refería a SQL y no a T-SQL. Además, no deseo enviar ningún comando al servidor de base de datos pero solo quiero hacer el procesamiento sobre el código de SQL que usted considera como un texto simple. – Archie

6

Probar ANTLR - Hay un montón de gramáticas SQL allí.

+1

ninguna aplicación de muestra en .NEt -con el código fuente si es posible- ¿que usa AntLR? . – Kiquenet

+0

enlace @PuterdoBorato parece estar muerto :( – Chris

+0

@ Chris yo era capaz de generar algunos programas de análisis de SQL utilizando la cornamenta y 4.5.3 Este algo no parece ser compilables aunque analizadores de compilar:. https: // github .com/otra-chico/SqlSchemer/árbol/0374cf63c1143e2b120b698d78e79bef970ee37e/AntlrSqlParsers pasos que puede seguir para compilar programas de análisis de SQL a sí mismo (tal vez tenga más suerte la solución de los problemas): https://github.com/another-guy/ SqlSchemer/issues/2 Si lo hace, hágamelo saber. Todavía necesito un analizador en funcionamiento ... –

2

Pruebe GOLD Parser, es un potente y fácil de aprender motor BNF. Puede buscar las gramáticas ya hechas para lo que quiere (es decir, SQL ANSI 89 Grammar).

Empecé a usar esto para el análisis HQL (el lenguaje de consulta de NHibernate, muy similar a SQL), y es increíble.

ACTUALIZACIÓN: Ahora el equipo de desarrollo de NH ha realizado el análisis HQL utilizando ANTLR (que es más difícil de usar, pero más potente AFAIK).

4

VSTS 2008 Database Edition GDR incluye ensamblajes que manejan el análisis de SQL y la generación de scripts a los que puede hacer referencia desde su proyecto. Database Edition utiliza el analizador para analizar los archivos de script para representar el modelo en memoria de su base de datos y luego utiliza el generador de scripts para generar scripts SQL del modelo. Creo que solo hay dos ensamblajes que necesita tener y hacer referencia en su proyecto. Si no tiene la edición de la base de datos, puede instalar la versión de prueba para obtener los ensamblajes o puede haber otra forma de tenerlos sin instalar la edición de la base de datos. Echa un vistazo al siguiente enlace. Data Dude:Getting to the Crown Jewels.

+0

Mehmet, VSTS 2008 Database Edition GDR gestiona el análisis Sql para Oracle? – Kiquenet

7

Puede consultar un componente comercial: analizador sql general en http://www.sqlparser.com Admite la sintaxis SQL de Oracle, T-SQL, DB2 y MySQL.

+0

Genera un árbol de análisis de consulta interno en salida xml para su posterior procesamiento. Admite la subconsulta anidada, la combinación compleja y las instrucciones en el procedimiento almacenado. http://www.dpriver.com/blog/list-of-demos-illustrate-how-to-use-general-sql-parser/generate-internal-query-parse-tree-in-xml-for-further- processing/ –

+0

Sí, lo estoy usando, la API es un poco confusa, pero definitivamente hace el trabajo. Precio bastante razonable también. El apoyo es muy útil. – tbone

0

Como Diego sugirió, las gramáticas son la manera de ir en mi humilde opinión. He intentado Coco/r antes, pero eso es demasiado simple para SQL complejo. Hay ANTLR con a number of grammars listo.

Alguien incluso intentó construir un motor SQL, verifique el código si hay algo para usted en SharpHSQL - An SQL engine written in C#.

8

Específicamente para Transact-SQL (Microsoft SQL Server) que puede utilizar the Microsoft.SqlServer.Management.SqlParser.Parser namespace disponible en Microsoft.SqlServer.Management.SqlParser.dll, un montaje incluye con SQL Server y que se puede distribuir libremente.

Aquí hay un ejemplo de método para el análisis de T-SQL como una cadena en una secuencia de símbolos:

IEnumerable<TokenInfo> ParseSql(string sql) 
{ 
    ParseOptions parseOptions = new ParseOptions(); 
    Scanner scanner = new Scanner(parseOptions); 

    int state = 0, 
     start, 
     end, 
     lastTokenEnd = -1, 
     token; 

    bool isPairMatch, isExecAutoParamHelp; 

    List<TokenInfo> tokens = new List<TokenInfo>(); 

    scanner.SetSource(sql, 0); 

    while ((token = scanner.GetNext(ref state, out start, out end, out isPairMatch, out isExecAutoParamHelp)) != (int)Tokens.EOF) 
    { 
     TokenInfo tokenInfo = 
      new TokenInfo() 
      { 
       Start = start, 
       End = end, 
       IsPairMatch = isPairMatch, 
       IsExecAutoParamHelp = isExecAutoParamHelp, 
       Sql = sql.Substring(start, end - start + 1), 
       Token = (Tokens)token, 
      }; 

     tokens.Add(tokenInfo); 

     lastTokenEnd = end; 
    } 

    return tokens; 
} 

Tenga en cuenta que la clase TokenInfo es sólo una clase sencilla con las propiedades mencionadas anteriormente.

Tokens es esta enumeración:

e incluye constantes como TOKEN_BEGIN, TOKEN_COMMIT, TOKEN_EXISTS, etc.

+0

Parece el mejor. Pero parece que tengo que crear manualmente un árbol de expresiones. – Gqqnbig