我想用C#解析SQL代码。解析C#中的SQL代码#
具体来说,是否有任何可以解析SQL代码并生成树或任何其他结构的免费解析器?它也应该为嵌套结构生成适当的树。
它还应该返回该树的节点代表的是哪种语句。
例如,如果节点包含循环条件,则应该返回它是节点的“循环类型”。
或者有什么办法可以解析C#中的代码并生成我想要的类型的树?
我想用C#解析SQL代码。解析C#中的SQL代码#
具体来说,是否有任何可以解析SQL代码并生成树或任何其他结构的免费解析器?它也应该为嵌套结构生成适当的树。
它还应该返回该树的节点代表的是哪种语句。
例如,如果节点包含循环条件,则应该返回它是节点的“循环类型”。
或者有什么办法可以解析C#中的代码并生成我想要的类型的树?
使用微软Entity Framework(EF)。
它有一个“实体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上。
而这一切都在Ballmers打勾:-)
也有一个的代码项目,SQL Parser。
祝你好运。
尝试ANTLR - 那里有一堆SQL语法。
尝试GOLD Parser,它是一个功能强大且易于学习的BNF引擎。您可以搜索已经为您想要的语法而编写的语法(即:SQL ANSI 89 Grammar)。
我开始将它用于HQL解析(NHibernate查询语言,非常类似于SQL),它很棒。
更新:现在NH开发团队已经完成了使用ANTLR的HQL解析(这很难使用,但更强大的AFAIK)。
VSTS 2008数据库版本GDR包含处理SQL解析和脚本生成的程序集,您可以从项目中引用该程序集。 Database Edition使用解析器解析脚本文件以表示数据库的内存模型,然后使用脚本生成器从模型生成SQL脚本。我认为你的项目中只需要两个程序集并参考。如果您没有数据库版本,则可以安装试用版以获取程序集,也可以通过其他方式在没有安装数据库版本的情况下拥有它们。看看下面的链接。 Data Dude:Getting to the Crown Jewels。
您可以看看商业组件:general sql parser http://www.sqlparser.com 它支持Oracle,T-SQL,DB2和MySQL的SQL语法。
正如迭戈建议,语法是去恕我直言的方式。我以前试过Coco/r,但对于复杂的SQL来说太简单了。有ANTLR与a number of grammars准备好。
有人甚至试图建立一个SQL引擎,检查代码是否有你在SharpHSQL - An SQL engine written in C#你。
Scott Hanselman最近featuredIrony project其中包括一个示例SQL解析器。
专供的Transact-SQL(Microsoft SQL Server的),你可以使用the Microsoft.SqlServer.Management.SqlParser.Parser
namespace提供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
等
http://stackoverflow.com/questions/34102835 – user423430 2017-01-25 04:15:38