什么是用于解构SQL查询的优秀.NET库,允许我确定每列来自哪个表?

时间:2009-02-11 18:08:28

标签: c# .net sql

我的公司需要允许我们应用程序的内部用户通过我们的UI直接针对数据库编写查询。但是当我们显示结果时,我们的代码需要知道每个返回列的列和表是什么,以便可以使用一些颜色编码和每列的其他逻辑显示结果。

所以我希望有一个类或一些简单的代码可以进行SQL解析,并以某种方式为我提供SQL查询中每个返回列所代表的源表和列名。

一个例子

select b.FirstName As Name, c.Address From BusinessOwner b
    left join ContactLocation c on b.ID = c.OwnerID

所以我需要一些代码来确定“名称”输出列实际上来自BusinessOwner表,并且是标题为FirstName的列,而Address来自ContactLocation {1}}表。

6 个答案:

答案 0 :(得分:2)

但有些字段不是来自表格!例如:

select getdate()

甚至

select "hello world" as ShoutItOut from sysobjects

或者您可以拥有多个来源:

select field1 + field2 as Field1And2 from a inner join b on a.id = b.aid

答案 1 :(得分:1)

之前从未使用过这些人......但他们的产品看起来可以做你想做的事情: http://www.sqlparser.com/index.php

查看http://www.sqlparser.com/docs/How_to_identify_DB_objects_in_your_sql.html,这听起来很像您需要做的事情。

请注意......你尝试做的可能不是很有效。也许更多的时间在需求/用例方面将导致更好的解决方案(听起来您的用户需要一种快速简便的方法将标准格式应用于报表/显示...而且我不确定是否通过数据库表进行匹配/ field就是答案。)

答案 2 :(得分:1)

你可能会尝试这样的事情:

Select b.FirstName As BusinessOwner.Name, c.Address as ContactLoaction.Address
From BusinessOwner as b, ContactLocation as c

并且通过对从查询返回的列名的第一部分进行一些解析,您将确定列所属的表。 像这样的东西:

string tempName = tabel.Columns[0].ColumnName;
string tableName = tempName.Substring(0, tempName.IndexOf('.'));

答案 3 :(得分:0)

没有内置方法可以做到这一点,你需要一些自定义代码来维护你关心的映射。

由于select查询中的列可以来自一个表(如您的示例所示),多个表(添加,聚合,连接或以其他方式计算多个列),或者以标准方式执行此操作非常困难,或者根本没有表格(选择'保罗'作为名字),可能还有其他几种我没有想过的方法。

答案 4 :(得分:0)

来自Korzh的

EasyQuery是一个可嵌入的可视化查询设计器,最终用户可以使用它来构建查询。他们有Windows Forms和ASP.NET版本。

答案 5 :(得分:0)

听起来你可以比解析sql简单得多。 从提供的查询中获取DataReader并使用GetSchemaTable()方法。 你总是可以通过让用户在函数等中包装列来欺骗它,但你可以用这种方式很好地拍摄它......而且它是内置的!