Как разобрать оператор SQL Query для имен таблиц - PullRequest
5 голосов
/ 26 июня 2010

У меня есть строка, представляющая запрос 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

(обратите внимание, что я мог опечатывать запросы, но вы поняли).

Чтобудет лучшим / наиболее точным способом достижения этой цели?

Ответы [ 2 ]

4 голосов
/ 26 июня 2010

Вот способ сделать это, используя коммерческую утилиту (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' как таблицы, но этодовольно просто отфильтровать имена отдельных символов из ваших результатов

Я не использую и не владею этим инструментом, просто кое-что, что я нашел после некоторого поиска ...

1 голос
/ 09 августа 2011

Общий анализатор SQL, упомянутый Брайаном, может достичь этого более точным способом, вот статья для этого:

Получить таблицу и столбец в сложном сценарии SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...