我想使用C#解析SQL代码。
具体地说,是否有任何可以解析SQL代码并生成树或其他结构的免费可用解析器?它还应该能够为嵌套结构生成正确的树形结构。
它还应返回该节点表示的语句类型。
例如,如果节点包含循环条件,则应返回这是一个“循环类型”的节点。
或者,是否有任何方法可以在C#中解析代码,并生成所需类型的树形结构?
特别针对 Transact-SQL(Microsoft SQL Server),您可以使用 Microsoft.SqlServer.Management.SqlParser.Parser 命名空间,该命名空间可在 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
等常量。[警告:截至2021年可能不再适用]
使用微软的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上查看。
而且一切都在Ballmer的掌控下 :-)
The Code Project 上也有一个,SQL解析器。
祝你好运。
尝试使用 ANTLR - 那里面有很多SQL语法。
正如Diego所建议的那样,语法是我认为最好的选择。我以前尝试过Coco/r,但对于复杂的SQL来说太简单了。有ANTLR和许多准备好的语法。
甚至有人尝试构建一个SQL引擎,请检查代码,看看SharpHSQL - 用C#编写的SQL引擎是否适合您。