解析SQL查询并提取列名和表名

时间:2012-09-18 18:51:50

标签: c# sql parsing antlr

我有一个像这样的查询脚本:

  

SELECT View1.OrderDate,View1.Email,SUM(View1.TotalPayments)FROM dbo.View1    WHERE(View1.OrderStatus ='已完成')    GROUP BY View1.OrderDate,View1.Email    HAVING    (SUM(View1.TotalPayments)> 75);

有什么方法可以从SQL查询中提取一些关键信息吗?如表名和列名,我有2个问题:

  1. 我做了搜索,我发现了一些像ANTLR这样的解析器,但我做不到 找到解释在C#语言中使用此解析器的文档。
  2. 我们有什么办法可以使用Entity Frame Work来解析sql查询吗?我的查询是完全动态的,它们是在运行时创建的

3 个答案:

答案 0 :(得分:3)

我认为最好的答案是使用Irony解析器: http://irony.codeplex.com/

Hanselman有一个很好的链接,如何使用它来解析SQL: http://www.hanselman.com/blog/TheWeeklySourceCode59AnOpenSourceTreasureIronyNETLanguageImplementationKit.aspx

我希望这会有所帮助,祝你好运!

答案 1 :(得分:1)

您可以使用某些系统表来获取您要查找的信息。

select p.name ParentTable, r.name ReferencedTable, k.name KeyName
from sys.foreign_keys k
join sys.tables p on k.parent_object_id = p.object_id
join sys.tables r on k.referenced_object_id = r.object_id

根据数据库的一致性,您可以对关键名称进行假设。因此,如果参考表是[用户],您可以假设您正在引用UserId,如果您的表中有多个键,则这不是您正在寻找的答案。

答案 2 :(得分:-1)

您可以在像这样的实体框架中构建动态查询

If(case1)
{
    var query = db.x.where(x => x).toList();
}
else
{
   var query = db.x.where(y => y).toList()
}