Как извлечь информацию о столбцах и таблицах SQL

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

Проблема : У меня есть строка, содержащая данные, как показано ниже.

select * from table1; select col1,col2,col5 from table2; select col8 from table3;

Мне нужно найти список столбцов и имя таблицы, использованное в приведенной выше строке.

Я пробовал это с .lastIndexOf() and .SubString(), но он не дал точного результата, который мне нужен.

Желаемый результат:

  • Имя таблицы: "table2" Используемые столбцы: "col1, col2, col5"
  • Имя таблицы: "table1" Используемые столбцы: "*"
  • Имя таблицы: "table3" Используемые столбцы: "col8"

Как следует извлекать указанные выше данные?

Это не основной вопрос: грамматика SQL сложна, и ее нелегко разобрать. Google по запросу "sql parser", чтобы узнать больше. Но я предполагаю, что вы хотите иметь возможность анализировать только подмножество грамматики SQL. В этом случае вам нужно определить, какое подмножество и диалекты вы хотите поддерживать. Простая возможность анализировать одну строку примера не имеет особого смысла.

Joe 20.10.2018 04:31

Что сказал @joe, мы можем заставить его работать для этого, однако как насчет того, если вы использовали CTE и 1000 вложенных операторов sql с объединениями, а что нет, я не думаю, что кто-то захочет нести ответственность за то, что вы калечите и травмируете людей с этим кодом

TheGeneral 20.10.2018 04:45

Используйте Split(), чтобы разделить его на отдельные операторы, а затем напишите код для анализа раздела между SELECT и FROM для каждого оператора, снова используйте Split для этого раздела и извлеките список имен столбцов. Мы не собираемся писать для вас парсер SQL.

Ken White 20.10.2018 04:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
64
1

Ответы 1

Вы можете использовать этот код:

    string storedProcContent = "select * from table1; select col1,col2,col5 from table2; select col8 from table3;";
    Regex rx = new Regex(@"select ([\w,\*]+?) from ([\w]+)", RegexOptions.IgnoreCase|RegexOptions.Compiled);
    MatchCollection matches = rx.Matches(storedProcContent);

    Console.WriteLine("{0} matches found in:\n   {1}",
                       matches.Count, storedProcContent);

    foreach (Match match in matches)
    {
        GroupCollection groups = match.Groups;
        Console.WriteLine("Table name = {0}", groups[2].Value);
        Console.WriteLine("Column Used = {0}", groups[1].Value);
    }

Выход:

3 matches found in:
   select * from table1; select col1,col2,col5 from table2; select col8 from table3;
Table name = table1
Column Used = *
Table name = table2
Column Used = col1,col2,col5
Table name = table3
Column Used = col8

Другие вопросы по теме