У меня есть строка, представляющая SQL-запрос, и я должен извлечь названия таблиц от той строки. Например:
SELECT * FROM Customers
Возвратил бы "Клиентов". Или
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
Возвратил бы "Клиентов, Адреса". Быть более усовершенствованным:
(SELECT B FROM (SELECT C FROM (SELECT Element AS C FROM MyTable)))
Просто возвратил бы "MyTable"
(Отметьте, у меня может быть typo'd запросы, но Вы получаете идею).
Каков был бы лучше всего/больше всего точный способ выполнить это?
Вот способ сделать это с помощью коммерческой утилиты (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);
}
}
}
Обратите внимание, что он считает 'c' и 'a' как таблицы, но было бы довольно просто отфильтровать отдельные символьные имена из ваших результатов
Я не использую и не владею этим инструментом, просто то, что я нашел после некоторого поиска. ..