Analyse du code SQL en C #[fermé]

Je veux analyser le code SQL en utilisant C#.

Plus précisément, existe-t-il un analyseur disponible gratuitement qui peut analyser le code SQL et en générer un arbre ou toute autre structure? Il devrait également générer l'arbre approprié pour les structures imbriquées.

Il devrait également renvoyer quel type d'Instruction le nœud de cet arbre représente.

Par exemple, si le nœud contient une condition de boucle, il doit renvoyer qu'il s'agit d'un "type de boucle" d'un nœud.

Ou y a-t-il un moyen par que je peux analyser le code en C# et générer un arbre du type que je veux?

61
demandé sur Peter Mortensen 2009-02-26 07:20:04

8 réponses

Utilisez Microsoft Entity Framework (EF).

Il a un analyseur "Entity SQL" qui construit un arbre d'expression,

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

Ou quelque chose comme ça, vérifiez-le sur MSDN.

Et tout est sur Ballmers tick: -)

Il y en a aussi un sur le projet de Code, analyseur SQL.

Bonne chance.

9
répondu TFD 2014-06-20 12:01:40

Scott Hanselman a récemmentprésenté le projetIrony qui comprend un exemple D'analyseur SQL.

10
répondu user423430 2011-10-25 18:25:12

Spécifiquement pour Transact-SQL (Microsoft SQL Server), vous pouvez utiliser l'espace de noms Microsoft.SqlServer.Management.SqlParser.Parser disponible dans Microsoft.SqlServer.Gestion.SqlParser.dll , un assembly inclus avec SQL Server et qui peut être distribué librement.

Voici un exemple de méthode pour analyser T-SQL comme une chaîne dans une séquence de jetons:

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

Notez que la classe TokenInfo est juste une classe simple avec les propriétés référencées ci-dessus.

Tokens c'est ça énumération:

Et inclut des constantes comme TOKEN_BEGIN, TOKEN_COMMIT, TOKEN_EXISTS, etc.

8
répondu Andrey Belykh 2017-01-12 20:54:26

Vous pouvez jeter un oeil à un composant commercial: General sql parser à http://www.sqlparser.com Il prend en charge la syntaxe SQL D'Oracle, T-SQL, DB2 et MySQL.

7
répondu James 2010-03-09 13:15:21

Try ANTLR - il y a un tas de grammaires SQL là-bas.

6
répondu Andrew Peters 2009-02-26 05:25:22

VSTS 2008 Database Edition GDR inclut des assemblys qui gèrent L'analyse SQL et la génération de scripts que vous pouvez référencer à partir de votre projet. Database Edition utilise l'analyseur pour analyser les fichiers de script pour représenter le modèle en mémoire de votre base de données, puis utilise le générateur de script pour générer des scripts SQL à partir du modèle. Je pense qu'il n'y a que deux assemblages que vous devez avoir et référencer dans votre projet. Si vous n'avez pas l'édition de base de données, vous pouvez installer la version d'essai pour obtenir la assemblys ou il pourrait y avoir une autre façon de les avoir sans installer l'édition de base de données. Consultez le lien suivant. Data Dude: se rendre aux joyaux de la Couronne .

4
répondu Mehmet Aras 2009-04-30 02:10:01

Essayez Gold Parser , c'est un moteur BNF puissant et facile à apprendre. Vous pouvez rechercher les grammaires déjà faites pour ce que vous voulez (ie: SQL ANSI 89 Grammar ).

J'ai commencé à l'utiliser pour l'analyse HQL (le langage de requête NHibernate, très similaire à SQL), et c'est génial.

Mise à jour: maintenant, l'équipe de développement NH a fait L'analyse HQL en utilisant ANTLR (qui est plus difficile à utiliser, mais plus puissant AFAIK).

2
répondu Diego Jancic 2012-06-12 20:40:31

Comme Diego l'a suggéré, les grammaires sont la voie à suivre à mon humble avis. J'ai déjà essayé Coco / r, mais c'est trop simple pour SQL complexe. Il y a ANTLR avec un certain nombre de grammaires prêt.

Quelqu'un a même essayé de construire un moteur SQL, vérifiez le code s'il y a quelque chose pour vous SharpHSQL - un moteur SQL écrit en C#.

1
répondu Rbjz 2011-08-25 20:16:13