在C#中解析SQL代码

Arc*_*hie 66 c# sql

我想用C#解析SQL代码.

具体来说,是否有任何可自由使用的解析器可以解析SQL代码并从中生成树或任何其他结构?它还应该为嵌套结构生成适当的树.

它还应该返回该树节点所代表的那种语句.

例如,如果节点包含循环条件,那么它应该返回这是节点的"循环类型".

或者有什么方法可以解析C#中的代码并生成我想要的类型的树?

And*_*ykh 18

特别是对于Transact-SQL(Microsoft SQL Server),您可以使用Microsoft.SqlServer.Management.SqlParser.dll中提供Microsoft.SqlServer.Management.SqlParser.Parser命名空间,这是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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,TokenInfo该类只是一个具有上述属性的简单类.

Tokens 这是枚举:

并包括像常数TOKEN_BEGIN,TOKEN_COMMIT,TOKEN_EXISTS等.


TFD*_*TFD 10

使用Microsoft 实体框架(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();
Run Code Online (Sandbox Code Playgroud)

或类似的东西,请在MSDN上查看.

这一切都在Ballmers上打勾:-)

代码项目中还有一个SQL Parser.

祝好运.

  • 这需要"Entity-SQL",一种SQL的方言; 我相信OP意味着常规SQL,例如"Transact-SQL"(SQL Server的方言).简而言之; 这不行. (25认同)
  • 我在msdn上找不到EntityCommand的Expression属性.http://msdn.microsoft.com/en-us/library/system.data.entityclient.entitycommand.aspx (24认同)
  • 对于-ve'rs.这个答案在2009年有效.EF继续前进,这不再适用 (14认同)
  • @TFD-该答案不再正确的事实是拒绝投票的有效理由。如您所知,这就是Stackoverflow的工作方式。它依赖于人们要么更新答案,要么接受将其优先投票给更正确的答案,然后再对其进行投票。 (4认同)

use*_*430 10

Scott Hanselman最近介绍Irony项目,其中包括一个示例SQL解析器.

  • (因为 CodePlex 即将关闭,所以有更新的链接:https://github.com/IronyProject/Irony) (2认同)

小智 8

您可以查看一个商业组件:http ://www.sqlparser.com上的常规SQL解析器 它支持Oracle,T-SQL,DB2和MySQL的SQL语法.


And*_*ers 6

试试ANTLR - 那里有很多SQL语法.