Есть ли способ проанализировать SQL-запрос, чтобы извлечь имена столбцов и таблиц?
Вопрос
У меня есть более 150 SQL-запросов в отдельных текстовых файлах, которые мне нужно проанализировать (только фактический SQL-код, а не результаты данных), чтобы идентифицировать все используемые имена столбцов и таблиц.Предпочтительно с указанием количества появлений каждого столбца и таблицы.Написание совершенно новой программы синтаксического анализа SQL сложнее, чем кажется, с вложенными операторами SELECT и тому подобным.
Должна быть программа или код, который делает это (или что-то близкое к этому), но я ее не нашел.
Решение
На самом деле я закончил тем, что использовал инструмент под названием SQL-Симпатичный Принтер.Вы можете приобрести настольную версию, но я просто воспользовался бесплатным онлайн-приложением.Просто скопируйте запрос в текстовое поле, установите для вывода значение "Список объектов базы данных" и нажмите кнопку Форматировать SQL.
Он отлично работает, используя около 150 различных (и сложных) SQL-запросов.
Другие советы
Как насчет использования отчета о плане выполнения в MS SQLServer?Вы можете сохранить это в XML-файл, который затем можно проанализировать.
Возможно, вы захотите посмотреть на что-то вроде этого:
который использует JavaCC для синтаксического анализа и возврата строки запроса в виде графика объектов.Я никогда им не пользовался, поэтому не могу поручиться за его качество.
Если вашему приложению необходимо это сделать, и у него есть доступ к базе данных, содержащей таблицы и т.д., вы могли бы запустить что-то вроде:
SELECT TOP 0 * FROM MY_TABLE
Использование ADO.NET.Это дало бы вам экземпляр DataTable, для которого вы могли бы запрашивать столбцы и их атрибуты.
Пожалуйста, идите с antlr...Напишите грамматику и следуйте инструкциям..которая приведена на сайте antlr .. в конечном итоге вы получите AST (абстрактное синтаксическое дерево).Для данного запроса...мы можем пройти через это и вывести всю таблицу, столбец которой присутствует в запросе..
В DB2 вы можете добавить к своему запросу что-то вроде следующего, но 1 - это минимум, который вы можете указать;он выдаст сообщение об ошибке, если вы попытаетесь указать 0:
FETCH FIRST 1 ROW ONLY