我的公司需要允许我们应用程序的内部用户通过我们的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}}表。
答案 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)
EasyQuery是一个可嵌入的可视化查询设计器,最终用户可以使用它来构建查询。他们有Windows Forms和ASP.NET版本。
答案 5 :(得分:0)
听起来你可以比解析sql简单得多。 从提供的查询中获取DataReader并使用GetSchemaTable()方法。 你总是可以通过让用户在函数等中包装列来欺骗它,但你可以用这种方式很好地拍摄它......而且它是内置的!