Разбор вложенных блоков в SQL с использованием C # - PullRequest
2 голосов
/ 24 февраля 2009

Я хочу выполнить анализ кода SQL. В этом я хотел бы отделить блоки в коде SQL. например, в коде ниже

for condition1 loop
stmt1;
for condition2 loop
stmt2;
end loop;
end loop;

Я хочу разделить эти два блока и создать структуру данных, которая будет содержать блок внешнего цикла, а также будет иметь блок внутреннего цикла.

Какой лучший способ сделать это? есть ли парсер, который может наилучшим образом обрабатывать вложенные циклы?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2009

Я бы предложил составной шаблон для блоков такого типа (а также для SELECT, CASE, WITH и аналогичных).

public interface ICodeEntity { }
public interface IObjectEntity { }
public class Column: IObjectEntity
{
    public string name;
    public System.Data.DbType type;
}
public class Table: IObjectEntity
{
    public List<Column> columns = new List<Column>();
    public string alias;
}
public class Where : ICodeEntity { }
public class GroupBy : ICodeEntity { }
public class OrderBy : ICodeEntity { }
public class Select : Table, ICodeEntity
{
    public List<Table> joinList = new List<Table>();
    public Where where;
    public GroupBy groupBy;
    public OrderBy orderBy;
}
public class Condition : ICodeEntity { }
public class If : ICodeEntity
{
    public Condition condition;
    public List<ICodeEntity> codeList = new List<ICodeEntity>();
}

и где-то в программе:

If if1 = new If();
if1.codeList.Add(new If());

см. Ссылки по теме:
CodeProject: Иллюстрированные шаблоны проектирования GOF на C #
фабрика данных и объектов: составной шаблон

0 голосов
/ 04 ноября 2011

Уже должен быть доступен SQL Parser, который может сделать это автоматически, вам не нужно изобретать велосипед. Просто гуглите "sql parser".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...