Разбор кода SQL в C# [закрыто]



Я хочу разобрать SQL-код с помощью C#.



в частности, есть ли какой-либо свободно доступный парсер, который может анализировать код SQL и генерировать дерево или любую другую структуру из него? Он также должен генерировать правильное дерево для вложенных структур.



Он также должен возвращать, какой тип оператора представляет узел этого дерева.



например, если узел содержит условие цикла, то он должен вернуть, что это "тип цикла" a узел.



или есть какой-либо способ, с помощью которого я могу разобрать код в C# и создать дерево нужного мне типа?

627   8  

8 ответов:

Использовать Microsoft Entity Framework (EF).

Он имеет синтаксический анализатор "Entity SQL", который строит дерево выражений,

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

или что-то в этом роде, проверьте это на MSDN.

и это все на Ballmers tick : -)

есть также один на проекте кода,синтаксический анализатор SQL.

удачи.

Скотт Хансельман недавно featured the проект иронии который включает в себя образец синтаксического анализатора SQL.

специально для Transact-SQL (Microsoft SQL Server) можно использовать the Microsoft.SqlServer.Management.SqlParser.Parser пространство имен в наличии Microsoft.От SQLServer.Управление.SqlParser.dll, сборка, включенная в SQL Server и которая может быть свободно распространена.

вот пример метода для разбора T-SQL в виде строки в последовательность токенов:

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

отметим, что TokenInfo класс просто класс выше свойства.

Tokens это перечисление:

и включает в себя константы, как TOKEN_BEGIN,TOKEN_COMMIT,TOKEN_EXISTS и т. д.

вы можете взглянуть на коммерческий компонент: общий синтаксический анализатор sql в http://www.sqlparser.com Он поддерживает синтаксис SQL Oracle, T-SQL, DB2 и MySQL.

попробовать ANTLR - там есть куча грамматик SQL.

VSTS 2008 Database Edition GDR включает сборки, которые обрабатывают синтаксический анализ SQL и создание сценариев, которые можно ссылаться из проекта. Database Edition использует синтаксический анализатор для анализа файлов сценариев для представления модели базы данных в памяти, а затем использует генератор сценариев для создания сценариев SQL из модели. Я думаю, что есть только две сборки, которые вам нужно иметь и ссылаться в вашем проекте. Если у вас нет выпуска базы данных, вы можете установить пробную версию, чтобы получить сборки или может быть другой способ иметь их без установки выпуска базы данных. Проверьте следующую ссылку. данные чувак: добраться до драгоценностей короны .

попробовать золотой парсер, это мощный и простой в освоении двигатель BNF. Вы можете искать грамматики, уже сделанные для того, что вы хотите (т. е.:грамматика SQL ANSI 89).

Я начал использовать это для анализа HQL (язык запросов NHibernate, очень похожий на SQL), и это потрясающе.

обновление: теперь команда NH dev выполнила анализ HQL с использованием ANTLR (который сложнее использовать, но более мощный AFAIK).

Как предложил Диего, грамматики-это путь к ИМХО. Я пробовал Coco/r раньше, но это слишком просто для сложного SQL. Есть ANTLR С ряд грамматик готово.

кто-то даже пытался построить SQL-движок, проверьте код, если есть что-то для тебя SharpHSQL-движок SQL, написанный на C#.

Comments

    Ничего не найдено.