C# 如何为表名解析SQL查询语句
我有一个表示SQL查询的字符串,需要从该字符串中提取表的名称。例如:C# 如何为表名解析SQL查询语句,c#,string,C#,String,我有一个表示SQL查询的字符串,需要从该字符串中提取表的名称。例如: SELECT * FROM Customers 将返回“客户”。或 将返回“客户、地址”。越来越高级: (SELECT B FROM (SELECT C FROM (SELECT Element AS C FROM MyTable))) 只需返回“MyTable” (注意,我可能打错了问题,但你明白了) 实现这一点的最佳/最准确的方法是什么?这里有一种方法,使用商业实用程序(sqlparser.com$149,免费试用)
SELECT * FROM Customers
将返回“客户”。或
将返回“客户、地址”。越来越高级:
(SELECT B FROM (SELECT C FROM (SELECT Element AS C FROM MyTable)))
只需返回“MyTable”
(注意,我可能打错了问题,但你明白了)
实现这一点的最佳/最准确的方法是什么?这里有一种方法,使用商业实用程序(sqlparser.com$149,免费试用) 请注意,它将“c”和“a”作为表计算,但从结果中筛选出单字符名称将非常简单
我不使用或拥有这个工具,只是在搜索后发现的东西…Brian提到的通用SQL解析器可以更准确地实现这一点,这里有一篇文章:
我想到了“为什么?”这个问题……您是否针对特定的RDBMS/方言?关于解析SQL还有一些问题,例如,我所看到的没有什么特别明确的结论。至于“为什么”,是因为我正在解析一个查询日志文件,并显示访问量最大的表、操作等。。这并不重要:)至于我的目标是什么,这是MS-SQL。@esac:这很重要。因为有时人们会发布问题,询问问题的具体解决方案,而不是实际问题本身。@jpaugh大约25年前,当我还是个小男孩时,我选择了这个屏幕名称。当时,一个名为“Red Hat”的linux新发行版刚刚上市。我几乎只使用Linux 5年,然后我找到了一份工作,进入了Windows计算机的商业世界。这是一个良好的开端,尽管它使用了“c”和“a”这两个词让人恼火,因为有些词的别名更长。
(SELECT B FROM (SELECT C FROM (SELECT Element AS C FROM MyTable)))
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using gudusoft.gsqlparser;
namespace GeneralSqlParserTest
{
class Program
{
static void Main(string[] args)
{
TGSqlParser sqlparser = new TGSqlParser(TDbVendor.DbVMssql);
sqlparser.SqlText.Text = "SELECT * FROM Customers c, Addresses a WHERE c.CustomerName='foo'";
sqlparser.OnTableToken += new TOnTableTokenEvent(OnTableToken);
int result = sqlparser.Parse();
Console.ReadLine();
}
static void OnTableToken(object o, gudusoft.gsqlparser.TSourceToken st, gudusoft.gsqlparser.TCustomSqlStatement stmt)
{
Console.WriteLine("Table: {0}", st.AsText);
}
}
}