【问题标题】:Parsing nested blocks in SQL using C#使用 C# 解析 SQL 中的嵌套块
【发布时间】:2009-02-24 12:15:06
【问题描述】:

我想对 SQL 代码进行分析。 在此我想将 SQL 代码中的块分开。 例如,在下面的代码中

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

我想将这两个块分开并创建一个数据结构,该结构将包含外部循环块并且还将具有内部循环块。

最好的方法是什么?是否有任何可用的解析器可以以最佳方式处理嵌套循环?

【问题讨论】:

    标签: c# sql parsing


    【解决方案1】:

    我会建议这种块的合成模式(也适用于 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: Illustrated GOF Design Patterns in C#
    data&object factory: Composite pattern

    【讨论】:

    • 嘿,谢谢你的建议。但是我将在解析完成后创建这些结构。我主要关心的是如何解析这样的循环?我的意思是是否有任何解析器可以标记代码中的字符串,还可以告诉我它像 if/for 循环是哪种类型的语句?
    【解决方案2】:

    应该已经有可用的 SQL Parser 可以自动为您执行此操作,您无需重新发明轮子。只需谷歌“sql解析器”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多