2009-02-26 2 views
59

Я хочу проанализировать SQL-код с помощью C#.Анализ кода SQL в C#

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

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

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

Или есть способ, которым я могу разобрать код на C# и создать дерево типа, которое я хочу?

+0

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

ответ

9

Используйте 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 тик :-)

Существует также одна над проектом кодекса, SQL Parser.

Удачи.

+23

Это принимает «Entity-SQL», диалект SQL; Я считаю, что OP означает обычный SQL, такой как «Transact-SQL» (диалект SQL Server). Вкратце; это не сработает. –

+0

Насколько я могу судить, в вопросе о оргии нет никаких подсказок? Итак, прежде чем мы это сделаем, мы будем ждать подтверждения @aaCog? – TFD

+0

Ну, я имел в виду SQL, а не T-SQL. Кроме того, я не хочу отправлять какие-либо команды на сервер db, а просто хочу обработать код SQL, который вы считаете простым текстом. – Archie

6

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

+1

любое приложение-образец в .NEt - с исходным кодом, если возможно, - которые используют AntLR ?? . – Kiquenet

+0

@PuterdoBorato ссылка кажется мертвым :( – Chris

+0

@ Крис, я был в состоянии произвести некоторые парсеры SQL, используя Antler 4.5.3, и это что-то, кажется, не будет компилироваться, хотя Составитель парсеры:. https: // GitHub .com/другое-парень/SqlSchemer/дерево/0374cf63c1143e2b120b698d78e79bef970ee37e/AntlrSqlParsers шаги вы можете следовать, чтобы скомпилировать парсер SQL самостоятельно (возможно, вам повезут больше разрешающих вопросы): https://github.com/another-guy/ SqlSchemer/issues/2 Если вы это сделаете, пожалуйста, дайте мне знать. Мне все еще нужен рабочий парсер ... –

2

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

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

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

4

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

+0

Mehmet, VSTS 2008 Database Edition GDR управляет Sql-парсингами для Oracle? – Kiquenet

7

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

+0

Создайте внутреннее дерево синтаксиса запросов в XML-файле для дальнейшей обработки. Поддержка вложенного подзапроса, сложного соединения и операторов в хранимой процедуре. http://www.dpriver.com/blog/list-of-demos-illustrate-how-to-use-general-sql-parser/generate-internal-query-parse-tree-in-xml-for-further- обработка/ – 2010-12-21 14:43:52

+0

Yup, я использую его, API немного запутывает, но определенно выполняет свою работу. Довольно разумная цена. Поддержка очень полезна. – tbone

0

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

Кто-то даже пытался построить двигатель SQL, проверьте код, если есть что-то для вас в SharpHSQL - An SQL engine written in C#.

8

Специально для Transact-SQL (Microsoft SQL Server), вы можете использовать the Microsoft.SqlServer.Management.SqlParser.Parser namespace доступные в Microsoft.SqlServer.Management.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 и т.д.

+0

Он выглядит как лучший. Но мне, похоже, нужно вручную построить дерево выражений. – Gqqnbig

Смежные вопросы