如何为表的名称解析SQL Query语句

esa*_*sac 5 c# string

我有一个表示SQL查询的字符串,我需要从该字符串中提取表的名称.例如:

SELECT * FROM Customers
Run Code Online (Sandbox Code Playgroud)

将返回"客户".要么

SELECT * FROM Customers c, Addresses a WHERE c.CustomerName='foo'

SELECT a.AddressZip FROM Customers c
INNER JOIN Addresses a ON c.AddressId=a.AddressId
Run Code Online (Sandbox Code Playgroud)

将返回"客户,地址".获得更高级:

(SELECT B FROM (SELECT C FROM (SELECT Element AS C FROM MyTable)))
Run Code Online (Sandbox Code Playgroud)

只需返回"MyTable"

(注意,我可能已经对查询进行了拼写错误,但你明白了).

实现这一目标的最佳/最准确的方法是什么?

Bri*_*ats 5

这是一种方法,使用商业实用程序(sqlparser.com 149 美元,免费试用)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,它将“c”和“a”计为表,但从结果中过滤掉单个字符名称将非常简单

我不使用或拥有这个工具,只是我在搜索后发现的东西......