我想使用C#解析SQL代码。
具体来说,是否有任何免费的解析器可以解析SQL代码并从中生成树或任何其他结构?它还应为嵌套结构生成适当的树。
它还应该返回该树的节点代表哪种语句。
例如,如果节点包含循环条件,则它应返回这是节点的“循环类型”。
还是有什么方法可以解析C#中的代码并生成我想要的类型的树?
Answers:
使用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();
或类似的东西,请在MSDN上查看。
一切都在鲍尔默斯上打勾:-)
The Code Project上还有一个SQL Parser。
祝好运。
特别是对于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;
}
请注意,TokenInfo
该类只是具有上述属性的简单类。
Tokens
这是枚举:
并包括像常数TOKEN_BEGIN
,TOKEN_COMMIT
,TOKEN_EXISTS
等。
尝试ANTLR-那里有一堆SQL语法。
VSTS 2008 Database Edition GDR包含可处理SQL解析和脚本生成的程序集,您可以从项目中引用这些程序集。Database Edition使用解析器来解析脚本文件以表示数据库的内存模型,然后使用脚本生成器从该模型生成SQL脚本。我认为您的项目中只有两个程序集需要引用。如果您没有数据库版本,则可以安装试用版来获取程序集,或者可以通过另一种方式来安装它们而无需安装数据库版本。查看以下链接。 数据花花公子:进入王室珠宝。
尝试使用GOLD Parser,它是功能强大且易于学习的BNF引擎。您可以搜索所需的语法(即:SQL ANSI 89语法)。
我开始将其用于HQL解析(NHibernate查询语言,与SQL非常相似),它很棒。
更新:现在,NH开发团队已使用ANTLR(较难使用,但功能更强大的AFAIK)完成了HQL解析。
正如迭戈建议的那样,语法是进行恕我直言的方式。我之前尝试过Coco / r,但这对于复杂的SQL来说太简单了。有ANTLR有一些语法的准备。
甚至有人尝试构建SQL引擎,在SharpHSQL中检查代码是否适合您-用C#编写的SQL引擎。